粗略记录一下继承基本都写字代码里了。

子类实例化的时候一定会调用父类默认构造方法,除非指定到别的构造方法。

base就是用来调用的关键字。。。

base()括号里面没有参数说明还是调用默认的构造方法,如下图的mammal的注释掉的那行就是默认的构造方法。

c#的继承_c#


c#的继承_父类_02


若是括号里有参数如下图:base(name)。。。就要调用上图中的Mammal里的public Mammal(string mamalName)这个方法了。。。。


c#的继承_System_03





这儿是父类的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace InherienceDemo
{
class Mammal
{
protected string name;
public Mammal() { }
public Mammal(string mamalName)
{
name = mamalName;
}

public void Talk()
{
Console.WriteLine("Mamale Talking.");
}

public string getName()
{
return name;
}

public virtual void Breath() //override子类重写父类的方法(只有父类方法是virtual的才能override)
{
Console.WriteLine(name+",正在呼吸");
}
public void SuckleYoung()
{
Console.WriteLine(name+",正在哺乳");
}
}
}


下边是子类的代码


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace InherienceDemo
{
class Horse : Mammal
{
//public string name;
public Horse(string name)
: base(name)
{

}



new public void Talk()//new关键字是子类隐藏继承的父类中的方法(这样外部再调用就是调的子类的不是父类的了,父类的方法被new之后隐藏了,只有子类的方法了)
{

Console.WriteLine("Horse Talking.");
}

public override void Breath() //override子类重写父类的方法(只有父类方法是virtual的才能override)
{
Console.WriteLine("马正在呼吸");
}

public void Trot()
{
//this.Breath();
Console.WriteLine(base.getName() + ",正在奔跑");
}
}
}


接下来是外部调用的代码(这里是很重要的关键父类对子类的引用)


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace InherienceDemo
{
class Program
{
static void Main(string[] args)
{
Mammal mamal = new Mammal("mm");

mamal.Breath();
//mamal.SuckleYoung();
mamal.Talk();

Horse horse = new Horse("hh");

horse.Breath();
//horse.SuckleYoung();
// horse.Trot();
horse.Talk();

//Whale whale = new Whale("ww");
//whale.Breath();
//whale.SuckleYoung();
//whale.Swim();

//父类引用可以引用子类的对象。
//父类引用只能调用子类继承自父类的方法。父类引用不能调用子类独有的方法。
//new关键字是子类隐藏继承的父类中的方法(这样外部再调用就是调的子类的不是父类的了,父类的方法被new之后隐藏了,只有子类的方法了)
//override子类重写父类的方法(只有父类方法是virtual的才能override)
//父类引用可以调用子类重写父类的方法,而不是调用父类原来的方法。
Mammal newMamal = new Horse("hh");
newMamal.Talk();
//newMamal.getName();
//newMamal.SuckleYoung();
newMamal.Breath();

//try
//{
// //子类引用不能直接引用父类对象,除非将父类对象的数据类型强制转换成子类
// Horse newHorse = (Horse)new Mammal("aa");
// //newHorse.Breath();
// //newHorse.SuckleYoung();
// //newHorse.getName();
//}
//catch (Exception ex)
//{
// Console.WriteLine(ex.Message);
//}

}
}
}

override特别注意:


c#的继承_System_04



protected修饰后只能被继承了的子类访问到,类外部不能访问。。。如下图;




c#的继承_继承_05