继承和Protected修饰符(C#)

继承:

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;
    }
}

结果截图:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值