C# 继承 虚方法

继承

[虚方法 (重写)](#虚方法 (重写))

[virtual 虚方法的关键字](#virtual 虚方法的关键字)

[override 重写的关键字](#override 重写的关键字)

练习:


继承

**继承:**很多类有相似的数据 相同的属性 相同的方法 也有不同的 这个时候就可以使用继承 让多个类去继承自某个具有相同数据的基类(父类) 这样在子类中就不用再定义这些相同的数据了

**优点:**便于维护代码 数据相同的类 只要需要在基类(父类)中定义即可 然后让拥有相同数据的派生类(子类)去继承这个父类就可以了 后期修改数据的时候 只需要修改父类中的定义就可以了

**多重继承(多继承):**可以有多个基类 每个子类都可以选择继承哪个基类 但是不能同时继承多个基类 c# 是不支持多重继承的 如果要完成这种模式 使用接口接口

cs 复制代码
//定义一个基类(父类)
internal class Boss
{
    public int HP { get; set; }
    public int SP { get; set; }


    public void Move()
    {
        Console.WriteLine("移动");
    }

    public  void BossAi()
    {
        Console.WriteLine("大招");
    }
}
cs 复制代码
//实现继承: ( : Boss )这样就代表了 当前这个Class1这个类 继承了 Boss类 
//Boos就是基类(父类) Class1就是派生类(子类)   父类中的数据成员 方法成员 在子类中也可以使用

internal class Class1 : Boss
{
    //以下注释部分可以省略,因为在父类Boss中已经存在
    //public int HP { get; set; }
    //public int SP { get; set; }
    //public void Move()
    //{
    //    Console.WriteLine("移动");
    //}

    //public void Ai()
    //{
    //    Console.WriteLine("普攻");
    //}

    // 小兵 自己的数据
    public double Heigth { get; set; }

    public void minAi()
    {
        Console.WriteLine("Min攻击");
    }


}
cs 复制代码
//Class2继承Class1
internal class Class2 :Class1
{
    
}
cs 复制代码
static void Main(string[] args)
{
    Boss b = new Boss();
    b.HP = 100;
    b.SP = 100;
    Class1 c1 = new Class1();
    c1.HP = 100;
    //Class1  继承Boss类之后的操作    第一个继承Boss的子类
    Class1 c2 = new Class1();
    c2.HP = 100;
    Console.WriteLine(c2.HP);
    c2.Move();
    c2.minAi();
    //Class2 第一个继承Class1的子类,第二个继承Boss的子类
    Class2 c3 = new Class2();
    c3.Move();
    c3.HP = 100;
    Console.WriteLine(c3.HP);
    c3.BossAi();
    c3.minAi();
}

虚方法 (重写)

virtual 虚方法的关键字

将方法升级为虚方法 然后就可以在子类中重写逻辑了 在子类中重写之后 就属于子类的逻 辑 父类中的不会改变

cs 复制代码
internal class Boss
{
    public int HP { get; set; }
    public int SP { get; set; }              
    public virtual void Move()
    {
        Console.WriteLine("Boss只能左右移动");
    }

    public void AI()
    {
        Console.WriteLine("大招");
    }
}

override 重写的关键字

如果想要重写父类中的某个方法逻辑 那么父类中的方法就可以升级为虚方法 然后在子类中对其进行重写。如果父类中的方法没有声明为虚方法 子类就不能重写

cs 复制代码
internal class Class1 :Boss
{
    
    public override void Move()
    {
        Console.WriteLine("小怪随意移动");
    }


    //隐藏方法
    public new void AI()
    {
        Console.WriteLine("普通攻击");
    }
}
cs 复制代码
 static void Main(string[] args)
 {
     Class1 c1 = new Class1();
     //子类中重新父类Move方法之后的方法
     c1.Move();
 }

练习:

现在 有 火车 飞机 轮船 汽车 几个类 属性有: 价格 速度 核载人数 方法有: 运行方式 到站方式 运用继承与虚方法 重写的形式 将它们各自的状态 完善

cs 复制代码
 static void Main(string[] args)
 {
     Car a = new Car();
     steamship b=new steamship();
     plane c=new plane();
     a.Price = 20;   a.Speed = 60;    a.Peoplenum = 5;
     a.Run ();   a.Stop ();  a.show ();

     b.Price = 2000; b.Speed = 1000; b.Peoplenum = 50;
     b.Run();    b.Stop();   b.show();

     c.Price = 1000;    c.Speed = 800;   c.Peoplenum = 100;
     c.Run();    c.Stop();   c.show();

 }
cs 复制代码
//定义一个交通工具的基类
internal class vehicle
{
    public int Price { get; set; }
    public int Speed { get; set; }
    public int Peoplenum { get; set; }
    public virtual void Run() { }
    public virtual void Stop() { }
    public void show() { Console.WriteLine($"价格:{Price} 速度:{Speed} 核载人数:{Peoplenum}"); }

}
cs 复制代码
//汽车
internal class Car : vehicle
{
    public override  void Run() { Console.WriteLine("起步"); }
    public override void Stop() { Console.WriteLine("熄火"); }

}
cs 复制代码
 //轮船
 internal class steamship : vehicle
 {
     public override void Run() { Console.WriteLine("漂流"); }
     public override void Stop() { Console.WriteLine("抛锚"); }
 }
cs 复制代码
 //飞机
 internal class plane: vehicle
 {
     public override void Run() { Console.WriteLine("飞行"); }
     public override void Stop() { Console.WriteLine("降落"); }
 }
相关推荐
xnglan3 小时前
使用爬虫获取游戏的iframe地址
开发语言·爬虫·python·学习
zhysunny4 小时前
04.建造者模式的终极手册:从快餐定制到航天飞船的组装哲学
java·开发语言·建造者模式
郝学胜-神的一滴4 小时前
建造者模式:构建复杂对象的优雅方式
开发语言·c++·程序人生·建造者模式
AAIshangyanxiu4 小时前
最新基于R语言结构方程模型分析与实践技术应用
开发语言·r语言·结构方程模型·生态统计学
Fly-ping6 小时前
【前端】JavaScript 的事件循环 (Event Loop)
开发语言·前端·javascript
范纹杉想快点毕业6 小时前
基于C语言的Zynq SOC FPGA嵌入式裸机设计和开发教程
c语言·开发语言·数据库·嵌入式硬件·qt·fpga开发·嵌入式实时数据库
rockmelodies6 小时前
【PHP安全】免费解密支持:zend52、zend53、zend54好工具
开发语言·安全·php
Reggie_L6 小时前
Stream流-Java
java·开发语言·windows
巴伦是只猫6 小时前
Java 高频算法
java·开发语言·算法
程序员编程指南6 小时前
Qt容器类:QList、QMap等的高效使用
c语言·开发语言·c++·qt