zoukankan      html  css  js  c++  java
  • How to extend a readonly property ?????

    BloodyAngel(9474649) 11:24:33
    问下override的问题:

    在C#中,基类如果定义了一个只读了属性,如:
    class Parent{
    public abstract string Name{get;}
    }

    子类Child中,如何把这个属性扩展为可写的?如:
    public override string Name{
        get{return this._name;}
        set{this._name = value;}
    }

    语法层面上,会报错。但是我觉得在逻辑层面上,出现以上扩展是很正常的。


    凹凸(360232736) 11:25:30
    将override改成virtual


    BloodyAngel(9474649) 11:26:34
    不符合逻辑,因为父类无法实现此属性。


    北田.(7376854) 11:26:40
    这样不行吧。。

    北田.(7376854) 11:27:44
    我觉得只能用new关键字覆盖。。。

    凹凸(360232736) 11:28:01
    我理解错了,我以为是让这个child的字类继续重写。

    北田.(7376854) 11:28:25
    感觉没有办法扩展。。。


    凹凸(360232736) 11:28:26
    同意北田的观点


    凹凸(360232736) 11:28:36
    只能覆盖


    凹凸(360232736) 11:29:23
    如果你能随意扩展,那接口的设计和基类的设计就有一定的危险性,因为它不能充分信任字类的行为。


    BloodyAngel(9474649) 11:29:27
    很郁闷的问题 .


    北田.(7376854) 11:29:42
    你为什么要扩展呢?

    BloodyAngel(9474649) 11:30:03
    我现在的方法是:
    class Child
    public void SetName(string value){..}


    北田.(7376854) 11:30:21
    我觉得通过其他途径可以解决这个问题。。


    凹凸(360232736) 11:30:51
    你这样做,虽然从语法层面解决了,但其实破坏了自己的设计,得不偿失。

    BloodyAngel(9474649) 11:32:17
    这样设计,逻辑上还算可以理解吧:
    父类规定了所有子类都有一个可读的Name属性。
    子类满足以上规定,并有一个SetName的行为改变 .

    说白了,就是没办法走属性那套 .

    凹凸(360232736)  11:32:45
    那为何不在父类中提供set呢?


    BloodyAngel(9474649)  11:34:10
    父类说了,不可以set。嘿嘿。

    凹凸(360232736)  11:35:48
    就把你的关键字从override改成new就行了


    哇哈哈(306121260)  11:35:58
    将override改成new 试试


    凹凸(360232736)  11:36:45
    但是,你现在解决了这个问题,显然你的设计是存在一些矛盾的,如果都用这种New的方法来解决,那多个子类就会与父类之间产生不一致了。


    北田.(7376854)  11:37:12
    同意凹凸的说法。。


    哇哈哈(306121260)  11:37:45
    没必要的话,不要刻意去追求继承


    北田.(7376854)  11:39:00
    接口的作用就是这个。。说明当时在设计父类的时候他的目的就是不允许改的。。如果现在硬要改那 你刚才那种public void SetName(string value){..}
    就可以。。这这样做感觉很不优雅。。


    凹凸(360232736)  11:39:01
    在设计原则中有一条是少用继承多用接口。
    但我们无法从这两个类中来判断是用继承和接口,只是,继承的时候尽量保持派生类和基类的一致性吧。


    BloodyAngel(9474649)  11:39:24
    还有,方案二

    public override string Name{get{return this.RealName;}}

    public string RealName{get;set;}


    这个是目前我觉得最好的方案了  逻辑上觉得不错,语法上也还行。


    凹凸(360232736) 11:40:06
    你用setName和RealName效果是一样的。


    BloodyAngel(9474649) 11:40:37
    这里的意思是说,子类使用RealName来欺骗式的实现了父类的Name


    BloodyAngel(9474649) 11:40:51
    都不怎么样,哈哈。

  • 相关阅读:
    寒假Day31:CSU1508地图的四着色bfs+dfs
    寒假Day32:链式前向星
    寒假Day30:HDU4507吉哥系列故事恨7不成妻数位dp
    寒假Day35:HTML表格+图像+超链接
    寒假Day35:2018蓝桥杯 B组
    寒假Day33:HTML入门
    寒假Day30:二叉树的遍历相关题型(求先序或后序、搜索树的判断)
    POJ 1177 Picture (线段树+离散化+扫描线) 详解
    MFC对话框中文出现乱码的解决方法
    如何枚举系统COM串口
  • 原文地址:https://www.cnblogs.com/zgynhqf/p/1729551.html
Copyright © 2011-2022 走看看