粗略记录一下继承基本都写字代码里了。
子类实例化的时候一定会调用父类默认构造方法,除非指定到别的构造方法。
base就是用来调用的关键字。。。
base()括号里面没有参数说明还是调用默认的构造方法,如下图的mammal的注释掉的那行就是默认的构造方法。
若是括号里有参数如下图:base(name)。。。就要调用上图中的Mammal里的public Mammal(string mamalName)这个方法了。。。。
这儿是父类的代码:
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特别注意:
protected修饰后只能被继承了的子类访问到,类外部不能访问。。。如下图;