继承
继承是面向对象程序设计中最重要的概念之一。继承允许我们根据一个类来定义另一个类,不需要完全重新编写新的数据成员和成员函数,只需要设计一个新的类,继承了已有的类的成员即可。这个已有的类被称为的基类(父类) ,这个新的类被称为派生类(子类)。
父类与子类
访问修饰符 class 父类名
{
...
}
class 子类名 : 父类名
{
...
}
父类中,不是所有的属性和方法都会继承给子类的。
- public :子类和其他都可以访问
- protected :外部不能访问,自己和子类可以访问
- privated :只能在该类中访问,不能继承
cs
class Animal
{
public int age;
public string name;
//外部不能访问,自己和子类可以访问
protected int money;
//只能在该类中访问,不能继承
private int home;
}
//public 成员和 protected 成员都会被继承过来
class Cat : Animal
{
public int legs = 4;
}
class Duck : Animal
{
public int legs = 2;
}
调用函数
派生类可以通过关键字base来调用基类的构造函数和方法。
cs
class Animal
{
public int age;
public string name;
//外部不能访问,自己和子类可以访问
protected int money;
//只能在该类中访问,不能继承
private int home;
public Animal(int inAge, string inName, int inMoney)
{
age = inAge;
name = inName;
money = inMoney;
Console.WriteLine("Animal 的构造函数被调用了!");
}
public virtual void Cry()
{
Console.WriteLine("Animal:动物叫");
}
}
//public 成员和 protected 成员都会被继承过来
class Cat : Animal
{
public int legs = 4;
//派生类可以通过关键字base来调用基类的构造函数。
public Cat(int inAge, string inName, int inMoney):base(inAge, inName, inMoney)
{
Console.WriteLine("Cat 的构造函数被调用了!");
}
public override void Cry()
{
//派生类可以通过关键字base来调用基类的方法。
base.Cry();
Console.WriteLine("喵喵喵");
}
}
class Duck : Animal
{
public int legs = 2;
//派生类可以通过关键字base来调用基类的构造函数。
public Duck(int inAge, string inName, int inMoney):base (inAge, inName, inMoney)
{
Console.WriteLine("Duck的构造函数被调用了!");
}
public override void Cry()
{
//派生类可以通过关键字base来调用基类的方法。
base.Cry();
Console.WriteLine("嘎嘎嘎");
}
}
基类的初始化
派生类继承了基类的成员变量和成员方法。因此父类对象应在子类对象创建之前被创建。
cs
static void Main(string[] args)
{
Animal animal = new Animal(1, "动物", 2);
animal.Cry();
Cat sonObj = new Cat(10, "猫", 100);
sonObj.Cry();
Console.WriteLine(sonObj.name);
//使用基类的类型存放子类的对象
Animal obj1 = new Cat(5, "猫", 101);
obj1.Cry();
Animal obj2 = new Duck(2, "鸭子", 2);
obj2.Cry();
}