C#继承中virtual、override、new的使用

C#继承中virtual、override、new的使用

1.第一个关键字:new — 子类中用于屏蔽父类对子类中同样签名(子类中的方法和父类中的方法名字和参数都一模一样)方法的影响。示例如下

//父类:动物类
public class Animal{
    public void Eat(){
        Console.WriteLine("我是动物,我每顿都要吃饭!");
    }
    public void Run(){
        Console.WriteLine("我是动物,我每天都要跑步!");
    }
}
//子类:狗类
public class Dog:Animal{
    //这个Eat()在编译器中会显示下划线,表示警告
    public void Eat(){
        Console.WriteLine("我是狗,我每顿都吃骨头!");
    }
    //这个Run()因为加了new,所以不会报警告
     public new void Run(){
        Console.WriteLine("我是狗,我跑一千米都不会丢!");
    }
}
###  main函数  ####
public static void Main(string[] args){
    Animal animal1 = new Animal();//实例化一个动物类对象
    Dog  dog1 = new Dog();//实例化一个狗类对象
    Animal animalDog1 = new Dog();//使用子类实例化父类(需要注意)

    animal1.Eat();//输出:我是动物,我每顿都要吃饭!
    animal1.Run();//输出:我是动物,我每天都要跑步!

    dog1.Eat();//输出:我是狗,我每顿都吃骨头!
    dog1.Run();//输出:我是狗,我跑一千米都不会丢!

    animalDog1.Eat();//输出:我是动物,我每顿都要吃饭!
    animalDog1.Run();//输出:我是动物,我每天都要跑步!
    Console.ReadKey();
}

分析:

  • 1.new 关键字对子类和父类的方法没有任何影响,只是表示子类新写了继承的父类方法
  • 2.new 关键字对用子类实例化父类生成的对象AnimalDog,在使用的过程中没有影响,AnimalDog只会调用父类的方法

2.第二个和第三个关键字:virtual和override — 子类中用于重写与父类有同样签名(子类中的方法和父类中的方法名字和参数都一模一样)方法。示例如下:

//父类:动物类
public class Animal{
    public virtual void Eat(){
        Console.WriteLine("我是动物,我每顿都要吃饭!");
    }
    public virtual void Run(){
        Console.WriteLine("我是动物,我每天都要跑步!");
    }
}
//子类:狗类
public class Dog:Animal{
    //这个Eat()重写了父类的函数体
    public override void Eat(){
        Console.WriteLine("我是狗,我每顿都吃骨头!");
    }
    //这个Run()因为加了new,所以不会报警告
     public new void Run(){
        Console.WriteLine("我是狗,我跑一千米都不会丢!");
    }
}
###  main函数  ####
public static void Main(string[] args){
    Animal animal2 = new Animal();//实例化一个动物类对象
    Dog  dog2 = new Dog();//实例化一个狗类对象
    Animal animalDog2 = new Dog();//使用子类实例化祖父类(需要注意)

    animal2.Eat();//输出:我是动物,我每顿都要吃饭!
    animal2.Run();//输出:我是动物,我每天都要跑步!

    dog2.Eat();//输出:我是狗,我每顿都吃骨头!
    dog2.Run();//输出:我是狗,我跑一千米都不会丢!!

    animalDog2.Eat();//输出:我是狗,我每顿都吃骨头!(实现子类方法体)
    animalDog2.Run();//输出:我是动物,我每天都要跑步!(实现父类自己的函数体)
    Console.ReadKey();
}

分析:

  • 1.(1)父类方法没有声明virtual,子类方法声明override是错误的;(2)父类方法声明了virtual,子类方法可以声明new也可以声明override。
  • 2.当子类使用override重写父类方法时,在用子类实例化的父类中,父类调用自己的virtual方法时,实现的子类重写的方法体,而如果子类是用new的话,那么父类调用自己的virtual的还是自己原来的方法体。

3.三级继承

//父类:动物类
public class Animal{
    public virtual void Eat(){
        Console.WriteLine("我是动物,我每顿都要吃饭!");
    }
    public virtual void Run(){
        Console.WriteLine("我是动物,我每天都要跑步!");
    }
}
//子类:狗类
public class Dog:Animal{
    //这个Eat()在编译器中会显示下划线,表示警告
    public override void Eat(){
        Console.WriteLine("我是狗,我每顿都吃骨头!");
    }
    //这个Run()因为加了new,所以不会报警告
     public new void Run(){
        Console.WriteLine("我是狗,我跑一千米都不会丢!");
    }
}
//孙子类:泰迪
public class TaidiDog:Dog{
    //这个Eat()在编译器中会显示下划线,表示警告
    public new void Eat(){
        Console.WriteLine("我是泰迪狗,我每顿都吃许多肾宝片!");
    }
    //这个Run()因为父类是new,所以会报错!!!!
     public override void Run(){
        Console.WriteLine("我是泰迪狗,我腿很短,所以我的频率很快!");
    }
}
###  main函数  ####
public static void Main(string[] args){
    Animal animal3 = new Animal();//实例化一个动物类对象
    Dog  dog3 = new Dog();//实例化一个狗类对象
    Animal animalDog3 = new Dog();//使用子类实例化父类(需要注意)
    Animal animalTaidiDog3 = new TaidiDog();//使用子类实例化父类(需要注意)

    animal3.Eat();//输出:我是动物,我每顿都要吃饭!
    animal3.Run();//输出:我是动物,我每天都要跑步!

    dog3.Eat();//输出:我是狗,我每顿都吃骨头!
    dog3.Run();//输出:我是狗,我跑一千米都不会丢!

    animalDog3.Eat();//输出:我是狗,我每顿都吃骨头!
    animalDog3.Run(); //输出:我是动物,我每天都要跑步!

    animalTaidiDog3.Eat();//输出:我是狗,我每顿都吃骨头!(泰迪类没有重写,但是其父类狗类重写了这个函数体,所以此处调用的狗类的函数体)
    animalTaidiDog3.Run();//报错(因为泰迪类的父类狗类这个函数是new,没有virtual,所以泰迪类使用virtual会报错)

    Console.ReadKey();
}
  • 1.不管多少级继承,子类需要关注其继承的类中是否有使用override的的,如果有的话,那么在调用函数的时候要多加注意。
  • 2.不管多少级继承,你只需要关注当前层的父类是如何声明函数的即可。

总的来说:

new不一定伴随着virtual使用,有virtual的时候不一定要有new和override。但是有override时总是有virtual。

随意转载,有错误请指正,多谢各位

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#,`override`关键字用于在派生类重写基类的虚方法、属性或索引器。通过使用`override`关键字,我们可以在派生类提供自己的实现,覆盖基类的默认实现。 要使用`override`关键字,需要满足以下条件: 1. 基类的方法、属性或索引器必须被声明为`virtual`或`abstract`。 2. 派生类的方法、属性或索引器必须具有相同的名称、返回类型和参数列表。 下面是一个示例,演示了如何在派生类使用`override`关键字来重写基类的虚方法: ```csharp class Animal { public virtual void MakeSound() { Console.WriteLine("The animal makes a sound"); } } class Dog : Animal { public override void MakeSound() { Console.WriteLine("The dog barks"); } } class Program { static void Main(string[] args) { Animal animal = new Animal(); animal.MakeSound(); // 输出: The animal makes a sound Dog dog = new Dog(); dog.MakeSound(); // 输出: The dog barks Animal animalDog = new Dog(); animalDog.MakeSound(); // 输出: The dog barks } } ``` 在上面的示例,`Animal`类的`MakeSound`方法被声明为`virtual`,表示它可以被派生类重写。`Dog`类继承自`Animal`类,并使用`override`关键字重写了`MakeSound`方法。在`Main`方法,我们创建了一个`Animal`对象和一个`Dog`对象,并分别调用它们的`MakeSound`方法。由于`Dog`类重写了`MakeSound`方法,所以在调用`dog.MakeSound()`时输出的是"The dog barks"。 此外,还可以使用`override`关键字重写基类的属性和索引器。重写属性和索引器的语法与重写方法类似。 希望这个例子能够帮助你理解`override`关键字在C#的用法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值