次の例を考えてみましょう。インターフェイス MyInterface があり、次に 2 つの抽象クラス MyAbstractClass1 と MyAbstractClass2 があります。MyAbstractClass1 は MyInterface を実装していますが、MyAbstractClass2 は実装していません。
これで、3 つの具象クラスができました。
- MyConcreteClass1 は MyAbstractClass1 から派生していますが、MyInterface を実装していません。
- MyConcreteClass2 は MyAbstractClass2 から派生していますが、MyInterface を実装しています。
- MyConcreteClass3 は MyAbstractClass1 から派生し、MyInterface を実装します。
ConcreteClass1 は MyAbstractClass1 から派生しているため、暗黙的に MyInterface も実装していますか? MyAbstractClass1 が MyInterface のメソッドを暗黙的に実装すると仮定すると、ConcreteClass1 を MyInterface にキャストして MyInterface メソッドにアクセスする必要はありません。
MyAbstractClass1 は、MyInterface のメソッドを抽象メソッドとして暗黙的に実装できますが、MyInterface のメソッドを抽象メソッドとして明示的に実装することはできません。どうしてこれなの?
MyConcreteClass3 は、基本クラスによって既に実装されているインターフェイスを実装しているため、過剰ですか? MyAbstractClass1 から派生したすべてのクラスも MyInterface を実装する必要があることを知っていたとしても、それを実行したい理由はありますか。
クラス図はこちら
代替テキスト http://files.getdropbox.com/u/113068/abstractclassesandinterfaces.png
コードは次のとおりです。
//interface
public interface MyInterface
{
void MyMethodA();
void MyMethodB();
void MyMethodC();
}
//abstract classes
public abstract class MyAbstractClass1 : MyInterface
{
public void MyMethodA()
{
}
void MyInterface.MyMethodB()
{
}
//Error: "the modifier abstract is not valid for this item"
//abstract void MyInterface.MyMethodC();
//This works
public abstract void MyMethodC();
public abstract void MyMethodZ();
}
public abstract class MyAbstractClass2
{
public void MyMethodX()
{
}
public abstract void MyMethodY();
}
//Concrete classes
//ConcreteClass 1: Only Abstract class implements the interface
public class ConcreteClass1 : MyAbstractClass1
{
public override void MyMethodC()
{
}
public override void MyMethodZ()
{
}
}
//ConcreteClass 1: Only Concrete class implements the interface
public class ConcreteClass2 : MyAbstractClass2, MyInterface
{
public override void MyMethodY()
{
}
public void MyMethodA()
{
}
public void MyMethodB()
{
}
public void MyMethodC()
{
}
}
//ConcreteClass 1: Both concrete and abstract class implement the interface
public class ConcreteClass3 : MyAbstractClass1, MyInterface
{
public override void MyMethodC()
{
}
public override void MyMethodZ()
{
}
}