Microsoft在抽象类方面表示“它们也很好地编译,因为如果在派生类中需要其他功能,可以将其添加到基类而不会破坏代码。”
如果我向基类添加其他功能,那么这不会破坏派生类,例如,如果我添加了另一个抽象方法,所有派生类现在都必须实现此方法,或者我误读了引用
以下是link原创文章。
答案 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");
}
}