继承:
1.基类中受保护成员只能从基类及其派生类中访问
2.实例化派生类时,会首先调用基类的构造器,避免遗忘对基类的构造器
3.基类如果没有可访问的构造器,编译器就不清楚如何构造基类,进而报错
4.避免出现这个问题,在派生类构造器的头部要显式指定要运行哪一个基类构造器
看下面例子:
public sealed partial class InheritanceExample : Page
{
public InheritanceExample()
{
this.InitializeComponent();
Phone phone = new Phone("XXUI");
//基类中受保护成员只能从基类及其派生类中访问。所以在InheritanceExample类中访问不了。
//phone.OperationSystem = "Flyme"; -- 错误
phone.Brand = "待定";
txtblk1.Text = string.Format("手机品牌:{0},手机系统:{1}", phone.Brand, phone.ShowSystemName());
Lumia lumia = new Lumia("Flyme");
//未设定lumia的Brand和ScreenSize属性,虽然父类的Brand设定了,但是两者并不是一样的,父类是父类的值,子类是子类的值,这点必须要认清。
//注意未设定值的Brand和ScreenSize最后的输出。
txtblk2.Text = string.Format("手机品牌:{0},手机系统:{1},手机屏幕:{2}", lumia.Brand, lumia.ShowSystemName(), lumia.ScreenSize);
Lumia lumia2 = new Lumia("Win10 Mobile");
lumia2.Brand = "Microsoft";
lumia2.ScreenSize = 5;
txtblk3.Text = string.Format("手机品牌:{0},手机系统:{1},手机屏幕:{2}", lumia2.Brand, lumia2.ShowSystemName(), lumia2.ScreenSize);
}
}
class Phone
{
public string Brand { get; set; }
private string _OperationSystem;
protected string OperationSystem
{
get
{
return _OperationSystem;
}
set
{
_OperationSystem = value;
}
}
public string ShowSystemName()
{
return OperationSystem;
}
//基类构造器(那么派生类构造器要指定调用基类的哪个构造器)
public Phone(string operationSystem)
{
OperationSystem = operationSystem;
}
}
class Lumia:Phone
{
public int ScreenSize { get; set; }
string ShowSystem(Phone phone)
{
//错误,Lumia类内部无法实现一个显式的Phone实例访问受保护对象OperationSystem
//换言之,Lumia不应该能访问Phone的受保护对象OperationSystem
//Lumia只能访问继承过来看作是自己属性的OperationSystem
//return phone.OperationSystem;
//如果要从Lumia类中访问保护成员OperationSystem,类限定符必须是派生类及其子类
//所以这边将phone实例转型为Lumia类型
Lumia lumia1 = (Lumia)phone;
return lumia1.OperationSystem;
//Lumia lumia2 = phone as Lumia;
//return lumia2.OperationSystem;
}
//注意这个构造函数必须要写,还有后面的":base(operationSystem)"
//实例化派生类,首先会调用基类构造器,来避免绕过对基类的初始化
//如果不在派生类构造器头部显式指定运行哪一个基类构造器,就会因为缺少可访问的构造器而报错
public Lumia(string operationSystem):base(operationSystem)
{
OperationSystem = operationSystem;
}
}
结果截图: