一般情况下,C#中的每个抽象函数都是虚拟的吗?
我在看堆栈溢出问题抽象函数和虚函数有什么区别?我想知道每个抽象函数是否应该被认为是C#中的虚函数还是一般?
我对“你必须忽略/你可能会忽略”对这个问题的回应有些困惑。 不是C#程序员,我倾向于认为抽象函数只是一个编译时概念,而抽象函数是定义的虚函数,因为您必须至少提供一个,但可以在层次结构的更下方提供多个实现。
虚拟函数也有一个编译时间维度,因为你不能覆盖非虚函数,但它们大多是一个运行时概念,因为它只是基于实际的接收器选择了正确的方法实现。
是。 来自C#3.0规范的第10.6.6节:
当实例方法声明包含抽象修饰符时,该方法被称为抽象方法。 虽然抽象方法也隐含地也是虚拟方法,但它不能使修饰符为虚拟。
它必须是虚拟的(并且Jon Skeet已经提出了证明它的规范),因为给定对抽象基类的引用,必须调用具体派生类的实现。 例如,给定经典动物层次结构:
abstract class Animal{
public abstract void Speak();
}
class Cat : Animal{
public override void Speak(){Console.WriteLine("meow");}
}
class Dog : Animal{
public override void Speak(){Console.WriteLine("bark");}
}
如果函数不是虚拟的,那么接受Animal
对象并调用Speak
方法的函数将不知道要调用哪个实现。
static void TalkToAnimal(Animal a){
Console.WriteLine("Hello, animal.");
a.Speak();
}
但请注意,接口实现默认情况下不是虚拟的。 由于接口与类的工作方式不同,真正的多态性对于查找接口方法的实现没有必要。
是的。 为了证明:
abstract class A {
public abstract void Foo();
}
class B : A {
public override void Foo()
{ /* must do */ }
}
class C : B {
public override void Foo()
{ /* can do */ }
}
链接地址: http://www.djcxy.com/p/38119.html