初面网初面网

虚方法

如果希望在子类中能够重写父类的方法,那么父类中的方法就必须"抽象化"。这种抽象的方法(函数),我们称之为虚方法。

例如,动物都会叫,但是猫和狗的叫声是不同的。现在,以动物为基类,子类分别为猫类和狗类。那么"叫"这个动作作为一个函数的时候,在基类里应当"抽象化",而在具体的子类中才具体的实现。

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关键字去重写父类中的同名方法的操作能够隐藏掉父类里的方法。此时,在父类中的这种同名方法被称为隐藏方法。

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

更新于 2025/2/26