对微软有关抽象类的引用感到困惑吗?

时间:2011-04-06 11:56:28

标签: abstract-class oop

Microsoft在抽象类方面表示“它们也很好地编译,因为如果在派生类中需要其他功能,可以将其添加到基类而不会破坏代码。”

如果我向基类添加其他功能,那么这不会破坏派生类,例如,如果我添加了另一个抽象方法,所有派生类现在都必须实现此方法,或者我误读了引用

以下是link原创文章。

4 个答案:

答案 0 :(得分:0)

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();它会吃米饭+牛奶

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

答案 1 :(得分:0)

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

我同意。这很容易让人误解。

答案 2 :(得分:0)

在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

答案 3 :(得分:0)

,这意味着以下

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");
    }
}

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

考虑到这一点,inherting class(es)可以提供自己的实现。

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");
    }
}