【问题标题】:Do we inherit or implement abstract classes?我们是继承还是实现抽象类?
【发布时间】:2016-06-07 05:54:46
【问题描述】:

我注意到 MSDN 对“继承”和“实现”这两个术语非常谨慎。

我们实现接口,但继承非抽象类。 我想抽象类的完整方法是继承的,但是 实现了抽象方法。

  • 当抽象类由完整方法和抽象方法组成时,我们应该使用什么术语?抽象类一方面没有实例(这是接口的特性),另一方面它可能包含完整的方法(这是类的特性)。

【问题讨论】:

  • “extends”和“inherits from”在大多数 OOP 语言中可互换使用,以指示从基类派生,无论基类是否是抽象的,都不会改变关系。在讨论 .net、IMO 时,添加扩展方法足以避免通过使用“扩展”来表示继承关系而混淆事物。 “实现”总是指实现一个接口。
  • 假设,你应该使用术语“覆盖”
  • 从另一个类继承的类可能会覆盖其基类的虚方法(如果这些方法是抽象的,则它必须这样做),但继承关系不一定暗示被覆盖的行为,例如有效的(尽管可能考虑不周......)继承关系可能只包括向子类添加额外的方法/字段,而不会覆盖任何行为。
  • 如果一个类也被声明为抽象类,则它只能覆盖其基本抽象类中的几个(不是全部)虚拟方法。

标签: .net oop inheritance abstract-class implements


【解决方案1】:

我想抽象类的全部方法都是继承的,但是 实现了抽象方法。

没有。抽象方法(定义)被基类的覆盖方法覆盖。

抽象方法声明引入了一个新的虚拟方法,但不提供该方法的实现。相反,非抽象派生类需要通过覆盖该方法来提供自己的实现。

当一个抽象类由两个完整的类组成时,我们应该使用什么术语 和抽象方法?

抽象类本身的定义表明它也可以包含方法定义,但它应该至少有一个抽象方法。

抽象类一方面没有实例(这是一个特点 接口),另一方面它可能包含完整的方法(这是一个 类的特征)。

抽象类显然是一个类的范畴。

【讨论】:

  • 我没有在 .net 中看到“扩展”这个词。可以创建一个没有抽象方法的抽象类,也没有编译错误,我刚刚检查过了。
  • @Spirit 你不必检查。我可以告诉你。 “抽象”一词的唯一作用是防止在不被继承的情况下创建类的直接实例。否则,它可能看起来就像普通类,带有构造函数等。我的意思是,可能。当然,它做的另一件事是允许使用虚拟方法
  • C#中任何非密封类都可以定义虚方法,abstract方法只能定义在抽象类上。
  • @PrestonGuillot - 我同意,但是,我认为问题中没有提到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-03
  • 2017-11-27
  • 2014-02-17
  • 2018-04-05
相关资源
最近更新 更多