次の例を考えてみましょう。私はインターフェイスMyInterfaceと2つの抽象クラスMyAbstractClass1とMyAbstractClass2を持っています。 MyAbstractClass1はMyInterfaceを実装しますが、MyAbstractClass2は実装しません。インターフェイスを実装する抽象クラスの理解に役立つ必要があります
私は3つの具体的なクラスを持っています。
- MyConcreteClass1はMyAbstractClass1から派生していますが、MyInterfaceは実装していません。
- MyConcreteClass2はMyAbstractClass2から派生していますが、MyInterfaceを実装しています。
- MyConcreteClass3はMyAbstractClass1から派生し、MyInterfaceを実装しています。
ConcreteClass1は、MyAbstractClass1から派生しているため、暗黙的にMyInterfaceを実装していますか? MyAbstractClass1が暗黙的にMyIntefaceのメソッドを実装すると仮定すると、ConcreteClass1はMyIntefaceメソッドにアクセスするためにMyInterfaceにキャストする必要はありません。
MyAbstractClass1は、暗黙的にMyInterfaceのメソッドを抽象メソッドとして実装できますが、明示的にMyInterfaceのメソッドを抽象メソッドとして実装することはできません。どうしてこれなの?
MyConcreteClass3は、その基本クラスによって既に実装されているインターフェイスを実装しているため、過剰ですか? MyAbstractClass1から派生するすべてのクラスがMyInterfaceも実装する必要があることを知っていたとしても、それをやりたい理由がありますか?ここ
はクラス図
alt text 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()
{
}
}
"明示的な実装は、実装しているクラスのプライベートなものです":実際には、それよりもプライベートなので、直接アクセスすることはできません。最初にインターフェイスにキャストする必要があります。誰もがインターフェイスを通してそれにアクセスできるので、それは幾分公開されます。本当に奇妙な、しかし、まだ素晴らしい機能。 –