Рассмотрим следующий пример. У меня есть интерфейс MyInterface, а затем два абстрактных класса MyAbstractClass1 и MyAbstractClass2. MyAbstractClass1 реализует MyInterface, а MyAbstractClass2 - нет.
Теперь у меня есть три конкретных класса.
- MyConcreteClass1 является производным от MyAbstractClass1, но не реализует MyInterface.
- MyConcreteClass2 является производным от MyAbstractClass2, но реализует MyInterface.
- MyConcreteClass3 является производным от MyAbstractClass1 и реализует MyInterface.
Реализует ли ConcreteClass1 также неявно MyInterface, поскольку он является производным от MyAbstractClass1? Предполагая, что MyAbstractClass1 неявно реализует методы MyInteface, тогда не нужно приводить ConcreteClass1 к MyInterface для доступа к методам MyInteface, верно?
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()
{
}
}