[虚方法 (重写)](#虚方法 (重写))
[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 { }
csstatic 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 虚方法的关键字
将方法升级为虚方法 然后就可以在子类中重写逻辑了 在子类中重写之后 就属于子类的逻 辑 父类中的不会改变
csinternal 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 重写的关键字
如果想要重写父类中的某个方法逻辑 那么父类中的方法就可以升级为虚方法 然后在子类中对其进行重写。如果父类中的方法没有声明为虚方法 子类就不能重写
csinternal class Class1 :Boss { public override void Move() { Console.WriteLine("小怪随意移动"); } //隐藏方法 public new void AI() { Console.WriteLine("普通攻击"); } }
csstatic void Main(string[] args) { Class1 c1 = new Class1(); //子类中重新父类Move方法之后的方法 c1.Move(); }
练习:
现在 有 火车 飞机 轮船 汽车 几个类 属性有: 价格 速度 核载人数 方法有: 运行方式 到站方式 运用继承与虚方法 重写的形式 将它们各自的状态 完善
csstatic 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("降落"); } }