使用Abstract类和接口进行多重继承

tec*_*mad 11 c#

我在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
{

}
Run Code Online (Sandbox Code Playgroud)

在编译时,我没有收到任何错误.编译器并没有强迫我实现方法"func();" 在"MyClass"中,它来自接口"IWork".Latter,我可以优雅地创建类"MyClass"的实例并调用函数"func()".为什么编译器不强迫我在"MyClass"中实现"func()"方法(它来自"IWork"接口?这是C#中的一个缺陷吗?

Pat*_*ick 9

在阅读这个主题时,我发现我不能轻易地把它全部放在我的脑海中,所以我编写了下面的一段代码,它充当了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();
    }
}
Run Code Online (Sandbox Code Playgroud)

给出以下输出:

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

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

FunctionB()在抽象类中实现,但可选择在具体类中重写.

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


Mar*_*cus 5

为了更好地理解接口背后的概念,我只是给你正确的实现代码:

public interface IWork{
    void func();
}

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

public class MyClass:WorkClass{
...
}
Run Code Online (Sandbox Code Playgroud)

基本规则:您需要始终在实现所在的位置包含接口.因此,如果在抽象类中创建方法并定义此方法的接口,则需要将接口实现到抽象类中,然后所有子类将自动实现此接口.

事实上,接口有两种功能可以用于:

1)作为一个"真正的"接口,提供实现接口的任何类的通用处理,因此您可以只通过一个接口处理几种类(不知道它们的真实类名).而"处理"意味着:调用方法.

2)作为其他(框架)程序员的帮助,不要搞砸你的代码.如果要确保方法不会被其他名称替换,则可以为包含所有"必须"方法名称的类定义接口.即使该方法被调用,您的程序员在更改方法名称时也会收到编译错误消息.

现在,您可以Myclass通过界面轻松处理您的问题IWork.


Fil*_*erg 3

因为abstract类实现了接口。

如果您的类MyClass不会继承自WorkClass您,则会收到一条错误消息'MyClass' does not implement interface member 'IWork.func()': 。

但您也继承自WorkClass,它实际上实现了接口所需的方法。

func()如果您想强制从它继承的类实现它,您可以将其标记为抽象,如下所示:

public abstract class WorkClass
{
    public abstract void func();

}
Run Code Online (Sandbox Code Playgroud)