2013-09-01 66 views
-3

我们可以将IDisposable定义为抽象类而不是像下面那样的接口。有什么缺点?为什么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; 
     } 
    } 
} 

我在同一个接口中编写了代码工作,否则就没有理由抽象类没有实现。这与我们定义Interface的方式相同,没有任何实现。但是,问题不仅仅是IDisposable,还涉及到我们使用的所有接口。为什么我们不简单地编写我们需要的方法,为什么我们要为实现接口再增加一个级别?因为Interface没有任何用处。我们总是必须在派生类中提供自己的实现,所以也没有代码可重用性的问题。以及接口如何解决C#中多重继承问题,如果我们不能重用代码?我想知道的是接口证明其存在的情况?

+0

是什么?这是没有意义的。如果你需要从其他东西中派生出来怎么办? –

+0

你为什么要这样? – Bazzz

+0

这是否意味着,如果我不需要从其他任何东西派生出来,那么IDisposable可能是一个抽象类?或者,有没有其他的优势,不作为抽象类? – SAM

回答

9

由于C#不支持多重继承,因此您的想法将无法将可处置性与现有的基类相结合。

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

+0

同意。当我们实现IDisposable接口时,我们也将实现给Dispose()。那么为什么要记住额外的IDisposable接口名称,然后给出实现。我们为什么不直接在派生类中编写我们的Dispose()方法,因为我们需要它?比如说我的派生类不需要多重继承?如果这是一个无效的论点,我很抱歉。 – SAM

+0

@SAM因为简单地调用一个方法'Dispose'并不意味着它被用于确定性资源处置。你也可以做一些愚蠢的事情,比如'private void Dispose(){...}'。 –

+0

加上,给定一个任意的对象,人们将不得不使用反射来确定它是否是一次性的。 –

相关问题