OOPの概念[継承、抽象化、カプセル化、ポリモーフィズム]の基本を知っています
親子関係の場合は継承を使用します[子は親が持つすべての機能を持つことができ、それ自体にさらに機能を追加することもできます]
また、クラス内のメソッドのデフォルト実装の部分セットに抽象クラス(Javaの場合)を使用します。これは、単純な継承によっても実装できます。
私の主張を明確にする以下の例を見てください。
継承:
親クラス
public class Parent {
// This method will remain same for all child classes.No need to override
public void abc() {
System.out.println("Parent here");
}
// This methods need to be overridden from child class
public int getROI() {
return 0;
}
}
子クラス
public class Child extends Parent{
@Override
public int getROI(){
return 5;
}
public static void main(String[] args) {
Child child =new Child();
child.abc();
System.out.println(child.getROI());
}
}
抽象クラス:
親クラス
abstract class Parent {
// This method will remain same for all child classes.No need to override
public void abc() {
System.out.println("Parent here");
}
// This methods need to be implemented from child class
public abstract int getROI();
}
子クラス
public class Child extends Parent{
public int getROI(){
return 5;
}
public static void main(String[] args) {
Child child =new Child();
child.abc();
System.out.println(child.getROI());
}
}
上記のプログラムの場合、o/pは同じになります。
O/P:
Parent here
5
だから私は思う、
継承:子クラスのメソッドをオーバーライドする必要があります
抽象クラス:メソッド名に抽象キーワードを入れ、子クラスにメソッドを実装する必要があります
したがって、抽象キーワードに関係なく、継承と抽象クラスは同じです
したがって、継承を使用して抽象クラスを実装できます。ここでは、メソッドシグネチャ変更クラスだけです(これが私の信念です)。
大きな違いはありますか?
継承は、プロパティを継承し、独自のプロパティもいくつか持つためのものです。
Abstractは、インスタンス化を制限することです。
例:
VehicleとVehiclePartを取り上げましょう。しかし、Vehicle自体は非常に抽象的であり、完全ではありません。したがって、Vehicleクラスを直接インスタンス化したくないので、抽象化する必要があります。車は乗り物よりも意味のある実体であり、車は乗り物です。したがって、車は車両を拡張し、抽象的ではありません。
abstract class Vehicle{
String name;
}
abstract class VehiclePart{
String name;
Date expiry;
}
class Car extends Vehicle{
List<VehicleParts> parts;
}
class RacingCar extends Vehicle{
}
class Gear extends VehiclePart{
int numOfGears;
}
継承:子クラスのメソッドをオーバーライドする必要があります
いいえ。上記の例では、CarがVehicleからnameなどのプロパティを継承していることがわかります。オーバーライドはオプションです。 RacingCarのように、Carのメソッドをオーバーライドして、少しカスタムにすることができます。しかし、基本的には、基本クラスからいくつかのプロパティを取得(継承)しています。車のすべての基本的なプロパティと同様に、RacingCarではなくCarになります。 RacingCarには固有のプロパティがあります。
抽象クラス:メソッド名に抽象キーワードを入れ、子クラスにメソッドを実装する必要があります
いいえ。そのインスタンス化を制限するだけです。例えば。 Vehicleオブジェクトには意味がないため、インスタンス化する必要はありません。乗り物は車やバスなどのようなものでなければなりません。それは単なる乗り物ではありません。したがって、抽象化を行い、インスタンス化を制限します。
継承を使用すると、メソッドをオーバーライドする必要はありません。 getROI
のChild
をオーバーライドしなくても、new Child().getROI()
を呼び出して、応答として0
を取得できます。
一方、メソッドが抽象である場合、デフォルトの実装がないため、子が実装する必要があります。
抽象クラスは、直接インスタンス化できないことを意味します。
new Parent()
許可されていません。
抽象メソッドは、拡張クラスに実装する必要があります。