繁体   English   中英

抽象与 界面混乱

[英]Abstraction Vs. Interface Confusion

等待,在您开始思考之前,我想澄清一下,我将问接口和抽象之间的常规区别。

我经历了MSDN中 Abstract和Interface之间的区别。

据说 :

通过更新基类,所有继承的类都会随着更改自动更新。
另一方面,接口一旦创建就无法更改。 如果需要新版本的接口,则必须创建一个全新的接口。

看这个:- 抽象和接口之间的区别

任何人都可以使用以下示例来证明这一点:-

abstract class WashingMachine
{
   abstract public void Wash();
}


class Philips : WashingMachine
{
   public Philips() {  }

   override public void Wash(){//Wash code here....}
}

class Samsung : WashingMachine
{
   public Samsung() {  }

   override public void Wash(){//Wash code here....}
}

class Videocon : WashingMachine
{
   public Videocon() {  }

   override public void Wash(){//Wash code here....}
}

现在,如果我在WashingMachine中添加了以下新的抽象方法:-

abstract public void Rinse(int loadSize);

如何通过更改自动更新所有继承的类(即Philips / Samsung / Videocon)?

它们不会得到更新-您仍然必须为从WashingMachine继承的每个类手动添加Rinse的实现。

我相信MSDN所说的是,如果您在抽象类中定义了一个非抽象方法,并且更改了方法,则从抽象类继承的所有类都将自动受益于该更改。

具体的派生类型都需要提供任何继承的抽象成员的实现...因此,在修改基础时,您的类型仍将需要提供Rinse实现。

http://msdn.microsoft.com/zh-CN/library/sf985hc5(v=vs.71).aspx

这是程序员通常在读取接口与抽象类之间的差异时所产生的困惑。 仅当抽象类中的更改是具体的时,您引用的行才为true。 我的意思是,您在实现中添加了属性或方法。 或者,如果我更具体,则对基本抽象类进行的任何更改都不会使任何具体的类抽象。 这种变化在抽象类中是可能的,并且您无法在接口中添加这种变化。

如何通过更改自动更新所有继承的类(即Philips / Samsung / Videocon)?

它们会突然变得不可编译,这不是更新吗?

但我想指出的是,实际上,抽象类中的抽象方法与接口中的方法之间没有区别。 主要区别在于以下事实:抽象类可以具有带有实现的方法,而接口不能具有。

实际上,我会说我不喜欢MSDN定义,并发现它令人困惑并且有些误导。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM