我对这种具有相同签名方法的抽象类和接口的情况感到困惑。派生阶段会有多少定义?如何解决通话?
public abstract class AbClass
{
public abstract void printMyName();
}
internal interface Iinterface
{
void printMyName();
}
public class MainClass : AbClass, Iinterface
{
//how this methods will be implemented here???
}
答案 0 :(得分:4)
默认情况下只有一个实现,但如果您使用void Iinterface.printMyName
签名定义方法,则可以有两个实现。看看有关Difference between Implicit and Explicit implementations的问题。您的样本中也有一些错误
printMyName
未标记为抽象,因此它
应该有身体。-
public abstract class AbClass
{
public abstract void printMyName();
}
internal interface Iinterface
{
void printMyName();
}
public class MainClass : AbClass, Iinterface
{
//how this methods will be implemented here???
public override void printMyName()
{
Console.WriteLine("Abstract class implementation");
}
//You can implement interface method using next signature
void Iinterface.printMyName()
{
Console.WriteLine("Interface implementation");
}
}
public class MainClass_WithoutExplicityImplementation : AbClass, Iinterface
{
//how this methods will be implemented here???
public override void printMyName()
{
Console.WriteLine("Abstract class and interface implementation");
}
}
使用示例
var mainInstance = new MainClass();
mainInstance.printMyName(); //Abstract class implementation
Iinterface viaInterface = mainInstance;
viaInterface.printMyName(); //Interface implementation
var mainInstance2 = new MainClass_WithoutExplicityImplementation();
mainInstance2.printMyName(); //Abstract class and interface implementation
Iinterface viaInterface = mainInstance2;
viaInterface.printMyName(); //Abstract class and interface implementation
答案 1 :(得分:0)
您可以在具体类中省略接口的实现,因为基类已经实现了它。但是,您也可以明确地实现接口,这意味着您可以“覆盖”基础(抽象)类中的行为(覆盖不是真正的正确单词)。这进一步期望将您的实例explicitky转换为接口以调用该方法:
public class MainClass : AbClass, Iinterface
{
//how this methods will be implemented here???
void Iinterface.printMyName()
{
throw new NotImplementedException();
}
}
您可以致电此cia ((Iinterface(myMainClassInstance).printMyName()
。如果您调用myMainClassInstance.printMyName
,则会调用基本实现。
如果您想支持基类中的基本实现,您可以创建方法virtual
并在派生类中覆盖它。