Appearance
虚方法
如果希望在子类中能够重写父类的方法,那么父类中的方法就必须"抽象化"。这种抽象的方法(函数),我们称之为虚方法。
例如,动物都会叫,但是猫和狗的叫声是不同的。现在,以动物为基类,子类分别为猫类和狗类。那么"叫"这个动作作为一个函数的时候,在基类里应当"抽象化",而在具体的子类中才具体的实现。
csharp
class Animal
{
public virtual void Say() // virtual,虚拟, 虚函数的关键词
{
Console.WriteLine("Animal Say!");
}
}
class Cat : Animal
{
public override void Say() // override, 重写,重写的关键词
{
Console.WriteLine("Miao!");
}
}
class Dog : Animal
{
public override void Say()
{
Console.WriteLine("Wang!");
}
}
class Dog2 : Animal
{
public new void Say()
{
Console.WriteLine("Wang!");
}
}
public class App
{
static void Main(string[] args)
{
Animal _animal = new Animal();
_animal.Say();
_animal = new Dog();
_animal.Say(); // 猜猜这里输出什么
_animal = new Dog2();
_animal.Say(); // 猜猜这里输出什么
Dog dog = new Dog();
dog.Say();
Cat cat = new Cat();
cat.Say();
Console.ReadKey();
}
}
override是重写,基类的方法在派生类里是直接抹去然后重写,所以调用的是子类方法;new只是将基类的方法在派生类里隐藏起来,调用的仍旧是基类方法。
隐藏方法
像上面一样,子类里用new关键字去重写父类中的同名方法的操作能够隐藏掉父类里的方法。此时,在父类中的这种同名方法被称为隐藏方法。
csharp
class Animal
{
public virtual void Say() // virtual,虚拟, 虚函数的关键词
{
Console.WriteLine("Animal Say!");
}
}
class Dog2 : Animal
{
public new void Say()
{
Console.WriteLine("wan!");
}
}
public class App
{
static void Main(string[] args)
{
Animal _animal = new Animal();
_animal.Say();
_animal = new Dog2();
_animal.Say(); // 猜猜这里输出什么
Console.ReadKey();
}
}