重複の可能性:
インターフェース vs 基本クラス
インターフェース vs 抽象クラス (一般的な OO)
抽象クラス vs Java のインターフェース
だから私はプログラミングコースでインターフェイスと抽象クラスについて学んでいます。2 つのトピックは非常に似ているようです。どちらも継承に関係していることは理解していますが、両者の違いは何ですか?
重複の可能性:
インターフェース vs 基本クラス
インターフェース vs 抽象クラス (一般的な OO)
抽象クラス vs Java のインターフェース
だから私はプログラミングコースでインターフェイスと抽象クラスについて学んでいます。2 つのトピックは非常に似ているようです。どちらも継承に関係していることは理解していますが、両者の違いは何ですか?
抽象クラスには、メソッド本体にコードが含まれている場合がありますが、これはインターフェイスでは許可されていません。
2つの主な違いがあります。
抽象クラスにはメソッドを含めることができますが、インターフェースにはメソッドを含めることはできません。
私は通常それを次のように考えます:
Animal
したがって、たとえば、クラスを作成したい場合があります。そして、Dog
クラスCat
があります。犬も猫も寝ます。したがって、両方にスリープ方式を設定する必要があります。そして、彼らは本質的に同じように眠ります。したがって、Animal
クラスにメソッドを保持させる必要があります(とは同じであるためDog
)Cat
。
public abstract class Animal {
public void sleep() {
//make ZZZZ appear in the air or whatever
}
}
public class Dog extends Animal {
//This class automatically has the sleep method
}
public class Cat extends Animal {
//This class automatically has the sleep method
}
一方、クラスがあったSnake
としましょう。Shark
ヘビとサメの両方が攻撃しますが、方法は異なります(毒と噛みつき)。だからあなたはAttacker
インターフェースを持っているかもしれません。
public interface Attacker {
//We HAVE to have this here
public void attack(); //Note - we didn't write the method here, just declared
}
public Snake implements Attacker {
//We HAVE to have this here
public void attack() {
//inject venom
}
}
public Shark implements Attacker {
public void attack() {
//rip apart
}
}
抽象クラスには、未定義のメソッド(インターフェースなど)を含めることもできることに注意してください。だから、あなたは唸り声とヒスpublic void makeMeanSound();
をAnimal
持っていることができます。主な違いは、抽象クラスが実際のメソッドを記述できることです。Dog
Cat
インターフェイス-強制的にメソッドを記述します(つまり、強制Snake
しShark
てメソッドを使用しますattack()
)。
抽象クラス-サブクラスに共通のメソッドを提供します。
インターフェースには、それを実装するクラスによって定義されなければならないメソッドがあります。
抽象クラスも同様です。ただし、抽象クラスでは、継承クラスが自動的に呼び出すことができるメソッド定義を含めることができます。
結論: すべての実装クラスがメソッドに対して完全に異なる定義を持っている場合は、インターフェースを使用してください。継承クラスが一部の定義を共有し、一部のメソッドに対して異なる定義を持つ場合は、抽象クラスを使用します。
例:
public interface Shape {
public float getArea();
public void doThings();
}
public class Circle implements Shape{
public float getArea() {
return Math.PI * R * R;
}
public void doThings() { }
}
public abstract class Quadilateral implements Shape {
public float getArea() { // defined
return l * h;
}
public abstract void doThings(); // left abstract for inheriting classes
}
public class Rectangle extends Quadilateral {
public void doThings() {
// does things
}
}
public class Parallelogram extends Quadilateral {
public void doThings() {
// does things
}
}