-1

インターフェイスと抽象クラスの両方で同じ抽象関数を持つインターフェイスを拡張する抽象クラスを実装する 1 つのクラスがあるとします。次に、クラスはどの関数インターフェイスまたは抽象クラスを継承し、その理由を継承します。

お気に入り:

public class A extends B implements I
{
    public void set()
    {
         // Some code here
    }
}

インターフェース:

public interface I {
    public void set();
}

抽象クラス:

 public abstract class B
 {
      public abstract void set();    
 }
4

2 に答える 2

4

両方。関数のシグネチャが一致する限り、コンパイラはこの「二重」継承を受け入れます。インターフェイスのメソッドの実装は、クラスがコンパイル可能であることを確認する必要がある「契約」にすぎないことに注意してください。インターフェースを実装することは、「私の具象クラスには set() メソッドが必要である」ことを意味するだけです。抽象クラス B を拡張するということは、「私の具象クラスはそのスーパークラスからメソッド set() を継承し、abstract として定義されているため、それを実装する必要がある」ことを意味します。これらの両方の命題が(例のように)一致する場合、すべて問題ありません。

インターフェイスと抽象クラスの間で関数のシグネチャに違いがある場合、具象クラスは両方のバージョンを実装する必要があります。

ところで、少し話題から外れていますが、可能な限り抽象クラスを避けるようにしてください。抽象クラスに抽象メソッドしかない場合、それはインターフェイスである必要があります。メソッドの一部にコードが含まれている場合は、継承ではなく構成を使用するようにリファクタリングすることを検討する必要があります。継承は悪です;)

于 2012-11-08T10:07:55.923 に答える
0

InterfaceAbstractクラスの両方のメソッドabstractは実装が与えられていないことを意味するため、どのメソッドから継承されるかを知ることは重要ではありません。

したがって、具象クラスで確認する必要implementがあるのは、インターフェイスで定義されているが抽象クラスでは実装されていないすべてのメソッドである必要があるということだけです。ANDスーパークラスで定義されているすべての抽象メソッドを実装します(インターフェースで定義されていない場合でも)(Guillaumeから)

于 2012-11-08T10:12:13.577 に答える