博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
How to extend a readonly property ?????
阅读量:5890 次
发布时间:2019-06-19

本文共 1871 字,大约阅读时间需要 6 分钟。

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
都不怎么样,哈哈。

转载地址:http://jlwsx.baihongyu.com/

你可能感兴趣的文章
杭州之行
查看>>
oracle ORA-00917: missing comma 是因为少逗号
查看>>
策略模式简介
查看>>
UIViewController中loadView的用法(应当注意的几点)
查看>>
POJ NOI0105-42 画矩形
查看>>
Java 数组在内存中的结构
查看>>
《关爱码农成长计划》第一期报告
查看>>
entity framework 6 通用数据类
查看>>
读取FTP上的excel文件,并写入数据库
查看>>
vs2008快捷键极其技巧 转载
查看>>
window 7上安装Visual Studio 2017失败的解决方法
查看>>
JavaScript 正整数正则表达式
查看>>
单元测试之Stub和Mock
查看>>
【转】Java泛型-类型擦除
查看>>
PredictionIO+Universal Recommender快速开发部署推荐引擎的问题总结(2)
查看>>
【232】◀▶ IDL显示地理图像
查看>>
【116】Windows 系统组合键
查看>>
学习进度表 04
查看>>
python---__getattr__\__setattr_重载'.'操作
查看>>
谈谈javascript中的prototype与继承
查看>>