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想要什么,因为