Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中纯抽象类和接口的区别是什么?_C#_Dependency Injection_Interface_Abstract Class - Fatal编程技术网

C# C中纯抽象类和接口的区别是什么?

C# C中纯抽象类和接口的区别是什么?,c#,dependency-injection,interface,abstract-class,C#,Dependency Injection,Interface,Abstract Class,我们都知道接口允许我们在C中进行多重继承,但我想知道,如果我们忽略这个原因,并假设我们的应用程序中总是需要单一继承,那么纯抽象类和接口之间的区别是什么。简而言之,您没有理由想要纯抽象类。永远不要使用纯抽象类,使用它们是没有意义的。如果您想使用“纯抽象类”,请使用接口,这样您仍然可以使用多个接口 接口就像合同。如果一个类实现了一个接口,那么它必须实现接口中列出的所有服务 抽象类就像一个骨架。它定义了扩展类的某种工作方式,同时允许抽象方法是唯一的。接口不允许多重继承。一个类可以实现多个接口,但这与继

我们都知道接口允许我们在C中进行多重继承,但我想知道,如果我们忽略这个原因,并假设我们的应用程序中总是需要单一继承,那么纯抽象类和接口之间的区别是什么。

简而言之,您没有理由想要纯抽象类。永远不要使用纯抽象类,使用它们是没有意义的。如果您想使用“纯抽象类”,请使用接口,这样您仍然可以使用多个接口

接口就像合同。如果一个类实现了一个接口,那么它必须实现接口中列出的所有服务


抽象类就像一个骨架。它定义了扩展类的某种工作方式,同时允许抽象方法是唯一的。

接口不允许多重继承。一个类可以实现多个接口,但这与继承不同。虽然默认接口方法C8模糊了这条线。谢谢你的回复,但我对理论上的答案不满意,举个例子,我们有依赖注入,如果不考虑多重继承或任何其他未来的问题,只考虑单一继承,我们可以用纯抽象类代替DI中的接口吗?这条线总是很模糊。实现和继承之间的区别到底是什么?从外部看?不,如果您想遵循正确的可靠原则,就不应该为DI使用抽象类。依赖注入原则1规定如下:高级模块不应依赖于低级模块。两者都应依赖于抽象,例如接口。使用接口,而不是抽象类。我想说的是,.NET中的抽象类不能是纯的,因为它们最终总是从对象继承的,因此除了vtable之外,还有一个非零的大小。接口不从对象继承,当您有一个实例时,它们可以转换为对象,因为所有实例都是从对象继承的某种类型。这个问题在C++中是有意义的,但在.NET语言中是没有意义的。如果没有理由使用纯抽象类,那么为什么C允许我们使用纯抽象类,并且不强制使用接口来代替纯抽象类。例如,在接口中的纯抽象类中声明和初始化常量,您不能声明常量。或者使用纯抽象类,以便以后可以在接口上扩展另一个抽象类。但一般来说,如果你必须这样做,即你的“接口”要求你声明常量;您需要一个完全没有实现的纯抽象类来扩展另一个抽象类,那么这很可能是一个设计问题。如果您声明一个纯抽象类并将其用作接口,您仍然可以选择实现以前未实现的方法,将其从抽象改为虚拟。默认接口实现将改变这一点,但缺少实例字段。我不知道我是否可以称之为抽象类的好处,因为你可以用任何东西实现接口,包括抽象类。我不知道我是否会说永远不要使用纯抽象类,因为有人会提出用例。但大多数时候,这看起来很奇怪,毫无意义。
public abstract class PureAbstract
{
    public abstract bool GetData();
}
public class ChildClass : PureAbstract
{
    public override bool GetData()
    {
        Console.WriteLine("Pure Abstract Class called");
        Console.ReadKey();
        return true;
    }
}
public class DIClass
{
    private PureAbstract pureAbstract;
    public DIClass(PureAbstract abstractClass)
    {
        this.pureAbstract = abstractClass;
        this.pureAbstract.GetData();
    }
}
class Program
{
    static void Main(string[] args)
    {
        ChildClass child = new ChildClass();
        DIClass pureAbstract = new DIClass(child);
    }
}