gpt4 book ai didi

c# - 抽象类和接口(interface)的多重继承

转载 作者:可可西里 更新时间:2023-11-01 08:39:46 27 4
gpt4 key购买 nike

我用C#.NET写了下面的代码

public interface IWork
{
void func();

}
public abstract class WorkClass
{
public void func()
{
Console.WriteLine("Calling Abstract Class Function");
}

}

public class MyClass:WorkClass,IWork
{

}

编译时,我没有收到任何错误。编译器没有强制我实现方法“func();”在派生自接口(interface)“IWork”的“MyClass”中。之后,我可以优雅地创建类“MyClass”的实例并调用函数“func()”。为什么编译器不强制我在“MyClass”(派生自“IWork”接口(interface))中实现“func()”方法?这是 C# 中的缺陷吗?

最佳答案

在阅读有关该主题的内容时,我发现我无法轻易地将所有内容放在脑海中,因此我编写了以下代码,作为 C# 工作原理的备忘单。希望对某人有所帮助。

public interface IMyInterface
{
void FunctionA();
void FunctionB();
void FunctionC();
}

public abstract class MyAbstractClass : IMyInterface
{
public void FunctionA()
{
Console.WriteLine( "FunctionA() implemented in abstract class. Cannot be overridden in concrete class." );
}

public virtual void FunctionB()
{
Console.WriteLine( "FunctionB() implemented in abstract class. Can be overridden in concrete class." );
}

public abstract void FunctionC();
}

public class MyConcreteClass : MyAbstractClass, IMyInterface
{
public override void FunctionB()
{
base.FunctionB();
Console.WriteLine( "FunctionB() implemented in abstract class but optionally overridden in concrete class." );
}

public override void FunctionC()
{
Console.WriteLine( "FunctionC() must be implemented in concrete class because abstract class provides no implementation." );
}
}

class Program
{
static void Main( string[] args )
{
IMyInterface foo = new MyConcreteClass();
foo.FunctionA();
foo.FunctionB();
foo.FunctionC();
Console.ReadKey();
}
}

给出以下输出:

FunctionA() 在抽象类中实现。不能在具体类中被覆盖。

FunctionB() 在抽象类中实现。可以在具体类中重写。

FunctionB() 在抽象类中实现,但可选择在具体类中覆盖。

FunctionC() 必须在具体类中实现,因为抽象类不提供实现。

关于c# - 抽象类和接口(interface)的多重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11358976/

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