gpt4 book ai didi

c# - 需要帮助理解实现接口(interface)的抽象类

转载 作者:行者123 更新时间:2023-11-30 15:12:36 24 4
gpt4 key购买 nike

考虑以下示例。我有一个接口(interface) MyInterface,然后是两个抽象类 MyAbstractClass1 和 MyAbstractClass2。 MyAbstractClass1 实现了 MyInterface,但 MyAbstractClass2 没有实现。

现在我有了三个具体类。

  1. MyConcreteClass1 派生自 MyAbstractClass1,但未实现 MyInterface。
  2. MyConcreteClass2 派生自 MyAbstractClass2,但确实实现了 MyInterface。
  3. MyConcreteClass3 派生自 MyAbstractClass1,并实现了 MyInterface。

ConcreteClass1 是否也隐式实现了 MyInterface,因为它派生自 MyAbstractClass1?假设 MyAbstractClass1 隐式实现了 MyInteface 的方法,那么不必将 ConcreteClass1 强制转换为 MyInterface 即可访问 MyInteface 方法,对吗?

MyAbstractClass1 可以将MyInterface 的方法作为抽象方法隐式实现,但不能将MyInterface 的方法作为抽象方法显式实现。这是为什么?

MyConcreteClass3 是否过多,因为它正在实现一个已由其基类实现的接口(interface)?即使您知道从 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()
{

}
}

最佳答案

Does ConcreteClass1 also implicitly implement MyInterface because it derives from MyAbstractClass1?

是的。

ConcreteClass1 should not have to be cast to a MyInterface to access the MyInteface methods right?

正确。 (myConcreteClass1 is MyInterface) 将评估 true

MyAbstractClass1 can implicitly implement a method of MyInterface as an abstract method, but can't explicitly implement a method of MyInterface as an abstract method.

显式实现是为了区分重叠的成员签名。显式实现对于您正在实现它的类是私有(private)的,因此派生类无法访问它(因此不能是抽象的)。您也不能强制派生自 MyAbstractClass1 的类显式实现 MyInterface,因此无法确保抽象成员永远被实现。

Is MyConcreteClass3 excessive because it's implementing an interface that is already implemented by its base class? Would there be a reason you would want to do that even if you knew all classes that derive from MyAbstractClass1 should also implement MyInterface.

不一定,如果你需要显式实现接口(interface)的一个成员以区别于MyConcreteClass3上的重叠成员。否则没有必要。

关于c# - 需要帮助理解实现接口(interface)的抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1107038/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com