Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.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#_.net_Oop_Interface_Abstract Class - Fatal编程技术网

C# 抽象与界面混淆

C# 抽象与界面混淆,c#,.net,oop,interface,abstract-class,C#,.net,Oop,Interface,Abstract Class,等等,在你开始思考之前,我想澄清一下,我不是要问接口和抽象之间的常规区别 我在一篇文章中讨论了抽象和界面之间的区别 据说: 通过更新基类,所有继承类都会随更改自动更新。 另一方面,接口一旦创建就无法更改。如果是新版本的 如果需要接口,则必须创建一个全新的接口 见此:- 有人能用下面的例子证明这一点吗- abstract class WashingMachine { abstract public void Wash(); } class Philips : WashingMachin

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

我在一篇文章中讨论了抽象和界面之间的区别

据说:

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

见此:-

有人能用下面的例子证明这一点吗-

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....}
}
现在,如果我在洗衣机中添加以下新的抽象方法:-

abstract public void Rinse(int loadSize);

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

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


您的具体派生类型都需要提供任何继承的抽象成员的实现……因此,当您修改基时,您的类型仍然需要提供一个漂洗实现


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


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

它们不会得到更新-您仍然必须手动向从
洗衣机继承的每个类添加
漂洗
的实现


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

这是程序员在阅读接口和抽象类之间的差异时通常会遇到的困惑。只有当抽象类中的更改是具体的时,您引用的行才是真的。我的意思是,您添加了一个属性或一个带有实现的方法。或者,如果我更具体一些,在基本抽象类中的任何更改都不会使任何具体类抽象。这样的更改在抽象类中是可能的,您无法在接口中添加这样的更改。

这是程序员在阅读接口和抽象类之间的差异时通常会遇到的困惑。只有当抽象类中的更改是具体的时,您引用的行才是真的。我的意思是,您添加了一个属性或一个带有实现的方法。或者,如果我更具体一些,在基本抽象类中的任何更改都不会使任何具体类抽象。这样的更改在抽象类中是可能的,并且您无法在接口中添加这样的更改

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

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

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

事实上,我要说的是,我不喜欢MSDN的定义,并发现它令人困惑,有些误导

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

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

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


事实上,我不喜欢MSDN定义,觉得它令人困惑,而且有点误导。

如果“Rinse”方法是虚拟的而不是抽象的,那么所有继承类都会自动更新。@Mert,请澄清您的观点。这没有任何意义。即使您将Rinse定义为virtual,它也不会自动更新,您必须重写派生类中的方法,否则它将被视为抽象类的实现方法,您不需要指定“virtual”关键字。我认为您需要澄清“update”的含义。如果您将其定义为虚拟并提供默认逻辑,那么所有派生类都可以使用默认逻辑或重写它。@Mert,很好,我理解了,所以它再次与其他人强调的非抽象方法相关……感谢您的输入……它帮助我理解了MSDN在那篇文章中的确切含义。希望MSDN能更具体,如果“Rinse”方法是虚拟的而不是抽象的,那么所有继承类都会自动更新。@Mert,澄清你的观点。这没有任何意义。即使您将Rinse定义为virtual,它也不会自动更新,您必须重写派生类中的方法,否则它将被视为抽象类的实现方法,您不需要指定“virtual”关键字。我认为您需要澄清“update”的含义。如果您将其定义为虚拟并提供默认逻辑,那么所有派生类都可以使用默认逻辑或重写它。@Mert,很好,我理解了,所以它再次与其他人强调的非抽象方法相关……感谢您的输入……它帮助我理解了MSDN在那篇文章中的确切含义。希望,MSDN可以更具体一些。那么,我是否可以得出这样的结论:“通过更新基类,所有继承类都会随着更改而自动更新”。MSDN希望坚持抽象类的实现/具体方法?我无法告诉您MSDN想要什么,因为