【问题标题】:Confused about quote fom Microsoft about abstract classes?对微软关于抽象类的引用感到困惑?
【发布时间】:2011-04-06 11:56:27
【问题描述】:

关于抽象类,微软表示“它们的版本也很好,因为如果派生类中需要额外的功能,可以将其添加到基类中而不会破坏代码。”

如果我向基类添加额外的功能,这不会破坏派生类,例如,如果我添加另一个抽象方法,所有派生类现在都必须实现这个方法,或者我误读了报价.

这是原始文章的link

【问题讨论】:

  • 我相信“功能”是指实现一些操作(方法),而不是添加抽象方法
  • @Nick,我添加了原始文章的链接。
  • @David Conde,我就是这么想的,但不确定。
  • 对我来说,关于这句话的真正问题是,“版本与什么相比好?”该示例适用的唯一其他情况是具有派生的具体类,并且该语句在这种情况下也是正确的。我建议你忽略那个特定的句子。当调用代码需要一些操作以特定方式工作但不关心其他操作时,抽象类很有用。

标签: abstract-class oop


【解决方案1】:

2010 年你的代码

public abstract class Animal{
    public abstract void eat();
}

public abstract class Human extends Animal{
    public  void eat(){
               //eat rice
    }
}

还有你的方法

feedAnimal(Animal a){
  a.eat();//it will eat rice for code in 2010
}

现在2015年,你有了新版本

public abstract class Human extends Animal{
    public  void eat(){
        //eat rice + milk
    }
}

现在如果你调用feedAnimal();,它会吃米饭+牛奶

我希望它能很好地解决问题;)

【讨论】:

  • 我知道这不会破坏派生类,但是如果我不想让动物吃米饭+牛奶,那么我必须实现另一个抽象方法,这会破坏派生类类。
  • 你不能添加方法,它会破坏整个事情。当你设计抽象类时,你需要确保它永远不需要任何额外的方法
  • 我认为,您可以将方法添加到基类 virtual(非抽象),如示例中所示。答案是特定于 c# 而不是 java。
  • 嗯,我是用纯OOP来回答的
【解决方案2】:

我认为向超类添加抽象方法并不构成添加“附加功能”,它们只是指能够在以后访问新子类中添加到超类的新方法。

我同意。这很有误导性。

【讨论】:

    【解决方案3】:

    OOP 中有一个想法,即您应该只从抽象类和接口继承。这篇文章似乎默认了这一点。因此,关于版本控制的评论涉及使用抽象类与接口的相对优势。

    C# 和 VB 鼓励过度使用继承,因为默认情况下类不是密封的。

    见:

    Why aren't classes sealed by default?
    Why aren't classes sealed by default?
    Why does the 'sealed' keyword exist in .Net?
    http://oredev.org/2010/sessions/c-s-greatest-mistakes

    【讨论】:

      【解决方案4】:

      ,意思如下

      public abstract class myBase
      {
          public abstract void sayHello();
      }
      
      public class child : myBase
      {
          public override void sayHello()
          {
              Console.WriteLine("hello");
          }
      }
      

      假设你想在派生类中添加一个也应该在基类中的新方法,你可以这样做

      public abstract class myBase
      {
          public abstract void sayHello();
          public virtual void saySomething()
          {
              Console.WriteLine("default something");
          }
      }
      
      public class child : myBase
      {
          public override void sayHello()
          {
              Console.WriteLine("hello");
          }
      }
      

      这里,代码在基类中添加了默认实现,它不会破坏任何其他代码。此外,如果派生类与基类的 saySomething 不同,则派生类可以提供 overrideen 行为。

      考虑到这一点,继承类可以提供自己的实现。

      public abstract class myBase
      {
          public abstract void sayHello();
      
          // here, if one can throw `NotImplementedException` 
          public virtual void saySomething()
          {
              Console.WriteLine("default something");
          }
      }
      
      public class child : myBase
      {
          public override void sayHello()
          {
              Console.WriteLine("hello");
          }
      
          public override void saySomething()
          {
              Console.WriteLine("child said something");
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-05
        • 2012-04-08
        • 1970-01-01
        • 2011-07-05
        • 2012-03-22
        相关资源
        最近更新 更多