继承使用符号“:”来表示继承
实例化子类,系统先调用父类的构造函数,然后调用 子类构造函数
1.继承具有层次结构,子类继承父类的状态和方法,通过子类后加:父类名字,如Child : Father
子类继承父类的所有关键字可以直接调用,父类需要添加public关键字(会出现基类可访问性低的问题)
子类的访问权限不能大于父类的访问权限
//子类
using System;
public class Child : Father
{
public Child()
{
}
public static void Main(string[] args)
{
Child chiObj = new Child();
chiObj.Speak();
Console.WriteLine("父类的字段显示 Height={0}", chiObj.Height);
}
//父类
using System;
public class Father
{
public int Height;
public int Weight;
public Father()
{
Height = 180;
Weight = 90;
}
public void Speak()
{
Console.WriteLine("Hello World!");
}
}
}
2.方法覆盖:如果子类和父类有同样的方法,子类的方法会把父类相同的的方法覆盖掉
如果子类和父类有同样的方法,但是这个需要通过base.父类方法来实现(注意this和base不能再静态方法中使用)
using System;
public class Child : Father
{
public Child()
{
}
public void Speak()
{
Console.WriteLine("孩子说话");
}
public void Display()
{
base.Speak();
this.Speak();
}
public static void Main(string[] args)
{
Child chiObj = new Child();
chiObj.Display();
Console.WriteLine("父类的字段显示 Height={0}", chiObj.Height);
}
}
using System;
public class Father
{
public int Height;
public int Weight;
public Father()
{
Height = 180;
Weight = 90;
}
public void Speak()
{
Console.WriteLine("父亲说话");
}
}
this始终调用本类的变量和方法
base始终调用父类的变量和方法
主要用于在父类和子类之间调用相同的方法
多个子类继承
多个子类继承父类并修改同一个父类属性时,互不影响。
重写父方法
父类方法
public virtual void Move()//虚方法:父类提供一个可被重写的方法
{
Console.WriteLine("父类怪物移动方法");
}
子类方法
new 关键字,由于子类中 Move 函数名,与父类中 Move 函数名相同
所以用 new 关键词修饰,用以区分,并隐藏父类中 Move 方法
//子类里重写虚函数后,不论在哪里调用,都是调用重写后的 Move方法
//例如 Boss b=new Boss(); b.Ai()调用的Move方法,就是重写虚函数中 下边这个Move方法
//而不是父类中的 Move
public new void Move()
{
Console.WriteLine("这是子类-Boss的移动方法");
}
当你见到 Override 关键字,你的第一印象就应该想到,这个函数被重写了
当你见到 Override 并且,函数体中包含 base.相同的函数名,那就代表着 :这个函数是基于父类 函数重写/扩展的
/// <summary>
/// 这里因为没有 base,所以子类中的Move 就是下面一句代码
/// 父类中的Move,在当前类中就不存在了。因为在子类中重写了
/// </summary>
public override void Move()
{
Console.WriteLine("这是子类-Enemy1的移动方法");
}
-