Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.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# 为什么IDisposable是一个接口,而不是抽象类?_C# - Fatal编程技术网

C# 为什么IDisposable是一个接口,而不是抽象类?

C# 为什么IDisposable是一个接口,而不是抽象类?,c#,C#,我们可以将IDisposable定义为一个抽象类,而不是像下面这样的接口吗。缺点是什么 public abstract class absDisposable { public abstract void Dispose(); } public class childClass : absDisposable { SqlConnection objConnect = new SqlConnection("connstring"); public override vo

我们可以将IDisposable定义为一个抽象类,而不是像下面这样的接口吗。缺点是什么

public abstract class absDisposable
{
    public abstract void Dispose();
}

public class childClass : absDisposable
{
    SqlConnection objConnect = new SqlConnection("connstring");

    public override void Dispose()
    {
        if (this.objConnect != null)
        {
            this.objConnect.Dispose();
            this.objConnect = null;
        }
    }
}

我在同一个接口中编写了代码,否则就没有理由不实现抽象类。这和我们定义接口的方式一样,没有任何实现,对吗?然而,问题不仅仅是IDisposable,而是关于我们使用的所有接口。为什么我们不简单地编写我们需要的方法,为什么我们要在实现接口方面多做一个级别?因为接口没有任何用途。我们总是要在派生类中给出我们自己的实现,所以代码的可重用性也没有问题。如果我们不能重用代码,接口如何解决c语言中缺乏多重继承的问题?我想知道的是,接口在什么情况下证明了它的存在?

由于C不支持多重继承,您的想法将使得不可能将可处置性与现有基类结合起来


由于IDisposable不包含任何实现,因此没有理由将其设为抽象类。

什么?这毫无意义。如果您需要从其他东西派生呢?为什么要这样做?这是否意味着,如果我不需要从其他东西派生,那么IDisposable可以是一个抽象类?或者,不把它作为抽象类还有其他好处吗?@Bazzz:我只是想了解接口的正确用法。什么时候我可以定义一些东西作为接口而不是抽象类?@SAM抽象类定义了一些您希望所有派生类都拥有的实现。接口不提供实现,它只定义结构。由于IDisposable没有任何实现,如果您将其定义为抽象类,它不会增加任何价值,实际上,您将失去继承方面的价值,因为派生类只能继承其他1个类。参见SLaks的答案。简单地说,接口就是将一个类分配给某个组。我的类是否属于可以处理的类组?对可识别的。。。等等,我同意。在实现IDisposable接口时,我们也给出了要处理的实现。那么为什么要记住额外的IDisposable接口名称,然后给出实现。既然我们需要,为什么不直接在派生类中编写Dispose方法呢?比如说我的派生类不需要多重继承?如果这是一个无效的参数,我深表歉意。@SAM因为简单地调用一个方法Dispose并不意味着它将被用于确定性资源处理。你也可以做一些愚蠢的事情,比如private void Dispose{…}。另外,给定一个任意的对象,你必须使用反射来确定它是否是一次性的。@ta.speot.is是的,我们可以编写像上面这样愚蠢的代码并使其工作,但是我们失去了多重实现功能。这就是我们选择接口而不是抽象类的唯一原因吗?@SAM-让我们从另一个角度来看它:拥有一个本身没有实现的抽象的一次性类有什么好处?您会问,是否唯一的原因是没有失去从其他基类继承的可能性。这本身就是一个很大的原因。对于抽象类,您有这个缺点,但没有任何优势。那么他想说什么呢?