继承:
继承(以及封装和多态性)是面向对象的编程的三个主要特征之一。
通过继承,可以创建重用、扩展和修改在其他类中定义的行为的新类。
其成员被继承的类称为“基类/父类/超类”,继承这些成员的类称为“派生类/子类/次类”。
继承语法格式:
访问修饰符 class 派生类名:基类名
{
派生类主体(是父类写父类主体 子类写子类主体)
}
继承的特性:
1.可传递性 2.单一性 3.访问修饰符
class Profession //父类
{
public string Zy = "资源";
private int Rs = 60;
public virtual void FF()
{
Console.WriteLine("头");
}
}
class Zhanshi: Profession //子类
{
public string Wuqi = "刀";
private string GJ = "物理攻击";
public override void FF()
{
Console.WriteLine("牙");
}
}
class Fashi: Zhanshi //子类
{
public string Wuqi = "法杖";
private string GJ = "魔法攻击";
public override void FF()
{
Console.WriteLine("脸");
}
}
class Program
{
static void Main(string[] args)
{
//new 声明哪个 输出哪个 构造不起决定性作用
//virtual+override 构造哪个 输出哪个 声明不起决定性作用
Profession profession = new Profession(); //声明父类 构造父类
//Zhanshi zhanshi = new Zhanshi(); //声明子类 构造子类
//Fashi fashi = new Fashi(); //声明子类 构造子类
Profession fashi1 = new Fashi(); //声明父类 构造子类
profession.FF();fashi1.FF(); //
Console.ReadKey();
}
}
虚成员virtual
重写父类中的成员,用virtual修饰;子类中对应override修饰。
1、字段不能是虚拟的,只有方法、属性、事件和索引器才可以是虚拟的
2、无论在子类和最初声明虚拟成员的类之间已声明多少个类,虚拟成员都将永远为虚拟成员;
3、如果类A声明了一个虚拟成员,类B从类A派生,类C从类B派生 则类C继承该虚拟成员,并且可以选择重写它,而不管类B是否为该成员声明了重写。
class Profession //父类A
{
public string Zy = "资源";
private int Rs = 60;
public virtual void FF() //声明虚拟成员
{
Console.WriteLine("头");
}
}
class Zhanshi: Profession //子类B
{
public string Wuqi = "刀";
private string GJ = "物理攻击";
public override void FF() //声明虚拟成员
{
Console.WriteLine("牙");
}
}
class Fashi: Zhanshi //子类下的子类C
{
public string Wuqi = "法杖";
private string GJ = "魔法攻击";
public override void FF() //声明虚拟成员
{
Console.WriteLine("牙");
}
}
Profession PA = new Profession();//声明父类 构造父类
Zhanshi PB = new Zhanshi();
Fashi PC = new Fashi();
PA.FF();PB.FF();PC.FF(); //输出
Console.ReadKey();
virtual+override和new区别
new 声明哪个 输出哪个 构造不起决定性作用
virtual+override 构造哪个 输出哪个 声明不起决定性作用
例如:下面代码用virtual+override 声明父类 构造子类 但是输出依然是子类中的虚拟成员
Profession fashi1 = new Fashi(); //声明父类 构造子类
fashi1.FF();构造子类 输出子类
Profession profession = new Profession(); //声明父类 构造父类
profession.FF(); 构造父类 输出父类中的虚拟成员
使用new时 声明父类 构造父类 输出父类/ 声明子类 构造子类 输出子类
使用virtual+override时 声明父类 构造父类 输出父类/声明父类 构造子类 输出子类