RedirectMatch 301 ^/(.*?)-/(.*)$ /$1/$2
输出:
class MyBaseClass
{
virtual public void Print()
{
Console.WriteLine("This is the base class.");
}
}
class MyDerivedClass : MyBaseClass
{
override public void Print()
{
Console.WriteLine("This is the derived class.");
}
}
class Program
{
static void Main()
{
MyDerivedClass derived = new MyDerivedClass();
MyBaseClass mybc = (MyBaseClass)derived;
derived.Print();
mybc.Print();
}
}
我不明白为什么第二次调用打印派生类的print()方法,因为我将mybc对象转换为基类。我希望它能打印基类打印方法。我在这里错过了什么吗?
答案 0 :(得分:4)
变量类型和实例类型是两种不同的类型。转换不会更改实例类型。
当你声明一个方法是虚拟/抽象的时候,你说的是你想要的 实例类型,用于在调用时确定行为。
另请注意,此赋值有效 - 不需要使用强制转换语法将变量类型从子类更改为baseclass。这种演员表可以隐含地完成。
MyBaseClass mybc = derived;
答案 1 :(得分:3)
你已经覆盖了它。它只调用派生方法。您必须明确call the base class' method:
override public void Print() {
base.Print();
Console.WriteLine("This is the derived class.");
}
答案 2 :(得分:2)
重写虚方法的重点是调用对象的底层(运行时)类型的版本,而不是静态(编译时)类型的版本 - 即使通过声明的类型调用它也是如此作为基类。
所以这表现完全正确。
如果不是这种情况,则会使类层次结构的许多实用程序变得无用,因为您无法通过传递给自定义派生类来更改传递给方法的类类型的行为。