namespace console_class_继承
{
class Program
{
public static void Main(string[] args)
{
Dog d = new Dog();
d.run();
new Dog(50);
Console.ReadKey(true);
}
}
class Animals{
public Animals(){ //可以不用实现
Console.WriteLine("我是父类默认构造函数");
}
public Animals(string name){
Console.WriteLine(name);
}
public virtual void run(){
Console.WriteLine(string.Format("class:{0} i`m running", this)); //这里是派生于animal 子类dog指针
walk();//这里还是通过向上查找原则,找到父类中的实现;
}
protected virtual void walk(){
Console.WriteLine("now, i`m walking... father");
}
}
class Dog: Animals{
public Dog():base("leo"){ //如果没有基类没有默认构造函数,则必须通过base指定对应的构造函数
Console.WriteLine(111);
}
//
public Dog(int weight):this(50, 100){ //通过this 来调用其他构造,先调用,在执行
Console.WriteLine("调用完this在执行");
}
public Dog(int weight, int height){
Console.WriteLine("我被其他构造函数通过this来调用了");
}
public override void run(){
base.run();
}
public void eat(){
Console.WriteLine("跑完就吃...");
}
// protected override void walk(){ //我们屏蔽掉这段实现
//
// Console.WriteLine("now, i`m walking...");
// }
}
//1、子类可以通过base关键字调用基类的属性方法;
//2、派生类初始化
// -> 初始化子类属性,字段
// -> 初始化父类子类属性,字段
// -> 初始化父类构造器
// -> 初始化派生类构造器
//3、如果派生类没有显试调用基类构造函数,如果基有默认构造则调用默认函数
//4、如果基类有多个构造函数,但没有默认构造函数,则必须通过派生类base关键字来显式调用
//5、类中有多个构造,可以通过this在初始化时,调用其他构造函数
}