【问题标题】:Abstraction Vs. Interface Confusion抽象与。界面混乱
【发布时间】:2012-07-26 21:04:42
【问题描述】:

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

我已经在MSDN 中了解了抽象和接口之间的区别。

据说:

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

看到这个:-

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

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)将如何自动随着更改而更新?

【问题讨论】:

  • 如果方法 'Rinse' 是虚拟的而不是抽象的,所有继承的类都会自动更新。
  • @Mert,澄清你的观点。这没有任何意义。即使你将Rinse定义为virtual,它也不会自动更新,你必须重写派生的方法,否则它被视为抽象类的实现方法,你不需要指定“virtual”关键字跨度>
  • 我认为您需要澄清“更新”的含义。如果将其定义为虚拟并提供默认逻辑,那么所有派生类既可以使用默认逻辑,也可以覆盖它。
  • @Mert,我明白了,所以它再次与其他人强调的非抽象方法有关....感谢您的输入....它帮助我了解究竟是什么MSDN 在那篇文章中的意思。希望,MSDN 可以更具体

标签: c# .net oop interface abstract-class


【解决方案1】:

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

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

【讨论】:

  • 我猜你是对的,在那篇文章中他们谈论的是抽象类中定义的非抽象方法。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    这是程序员在读取接口和抽象类之间的差异时通常会遇到的困惑。仅当抽象类中的更改是具体的时,您所指的行才是正确的。我的意思是你添加了一个带有实现的属性或方法。或者,如果我更具体一点,基本抽象类的任何更改都不会使任何具体类抽象。这种变化在抽象类中是可能的,你无法在接口中添加这种变化。

    【讨论】:

      【解决方案4】:

      所有继承类(即 Philips/Samsung/Videocon)将如何随着更改自动更新?

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

      但我想指出的是,抽象类中的抽象方法和接口中的方法实际上没有区别。主要区别在于抽象类可以有带实现的方法,而接口则不能。

      事实上,我会说我不喜欢 MSDN 的定义,并且觉得它令人困惑且有些误导。

      【讨论】:

      • 那么,我是否应该通过以下几行得出结论:“通过更新基类,所有继承类都会随着更改而自动更新。”,MSDN 想要坚持抽象类的实现/具体方法吗?
      • 我不能告诉你 MSDN 想要什么,因为我既不是 MSDN 的,也不是文章中的措辞是准确的。我宁愿不从“类已更新”的角度谈论继承。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2013-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多