C#继承

268 阅读2分钟

继承使用符号“:”来表示继承

实例化子类,系统先调用父类的构造函数,然后调用 子类构造函数

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的移动方法");
 }



-