实践一:子类调用基类构造函数
说明:子类Paladin的构造函数调用了基类Character的函数,语法格式是:base(),直接传参入基类的构造函数中。
代码:
public class Character
{
public String name;
public int exp;
public Character(String name)
{
this.name = name;
this.exp = 0;
}
public void PrintStatsInfo()
{
Console.WriteLine("name:{0}-{1} exp",name,exp);
}
}
public class Paladin : Character
{
public Paladin(String name) : base(name)
{
}
}
class MyHelloWorld
{
static void Main(string[] args)
{
Paladin knight = new Paladin("Arthur");
knight.PrintStatsInfo();
}
输出结果:
实践二:子类重写基类虚方法
说明:在之前代码的基础上定义了结构体Weapon(C#允许在结构体中定义方法,所以看起来和类很相似,但它们之间的本质区别在于结构体是值类型,而类是引用类型),然后子类Paladin中增加了一个Weapon类型的成员变量weapon,在它的构造函数中赋值weapon。再将基类Character的PrintStatsInfo成员函数改为虚方法(即增加“virtual”关键字使该方法可以在子类中被重写),最后在子类Paladin中重写该方法,调用基类方法并新增一行输出,显示Weapon的名字。
代码:
public class Character
{
public String name;
public int exp;
public Character(String name)
{
this.name = name;
this.exp = 0;
}
public virtual void PrintStatsInfo()
{
Console.WriteLine("name:{0}-{1} exp", name, exp);
}
}
public struct Weapon
{
public String name;
public int damage;
public Weapon(String name, int damage)
{
this.name = name;
this.damage = damage;
}
}
public class Paladin : Character
{
public Weapon weapon;
public Paladin(String name, Weapon weapon) : base(name)
{
this.weapon = weapon;
}
public override void PrintStatsInfo()
{
base.PrintStatsInfo();
Console.WriteLine("Hail {0}, take up your {1}!", name, weapon.name);
}
}
class MyHelloWorld
{
static void Main(string[] args)
{
Weapon sword = new Weapon("sword",10);
Paladin knight = new Paladin("Arthur",sword);
knight.PrintStatsInfo();
}
}
输出结果: