考虑以下示例。我有一个接口 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()
{
}
}