重写抽象类的 get 属性并添加 set 属性
2010-10-27 13:17
239 查看
如果你碰到一个这样的抽象类:
并且需要实现一个子类 MyNamedObject,他的 Name 属性是可以被外部设置的,一开始如果你这样写:
Oops,编译报错了:
试试用 new 怎么样:
可惜的是这两种写法都不行,语法上 new 不可以这样用。事实上,对于这种情况,因为c#语言的约束,是没有办法实现在子类里将 Name 属性变为可写的,虽然理论上属性是被编译成方法的,CLR是支持属性方法的重写和新增的,仅仅因为语法的限制。如果碰巧你不能修改基类的代码,那只能写出:
看起来不是很爽,但还过得去。如果你非要使用属性来实现Name,也是可以的,只是要加一层继承关系:
当然如果你恰好能够修改基类的话,最好把他改成:
这样就什么问题都没有了。
public abstract class NamedObject { public abstract string Name { get; } }
并且需要实现一个子类 MyNamedObject,他的 Name 属性是可以被外部设置的,一开始如果你这样写:
public class MyNamedObject : NamedObject { public override string Name { get; set; } }
Oops,编译报错了:
'MyNamedObject.Name.set': cannot override because 'NamedObject.Name' does not have an overridable set accessor
试试用 new 怎么样:
public class MyNamedObject : NamedObject { public override string Name { get; } public new string Name { set; } } public class MyNamedObject : NamedObject { public override string Name { get; new set; } }
可惜的是这两种写法都不行,语法上 new 不可以这样用。事实上,对于这种情况,因为c#语言的约束,是没有办法实现在子类里将 Name 属性变为可写的,虽然理论上属性是被编译成方法的,CLR是支持属性方法的重写和新增的,仅仅因为语法的限制。如果碰巧你不能修改基类的代码,那只能写出:
public class MyNamedObject : NamedObject { public override string Name { get; } public void SetName(string value) { } }
看起来不是很爽,但还过得去。如果你非要使用属性来实现Name,也是可以的,只是要加一层继承关系:
public class MyBasicNamedObject : NamedObject { public override string Name { get; } } public class MyNamedObject : NamedObject { public new string Name { get; set; } }
当然如果你恰好能够修改基类的话,最好把他改成:
public abstract class NamedObject { public string Name { get { return GetName(); } } protected abstract string GetName(); } public class MyNamedObject : NamedObject { public new string Name { get; set; } protected override string GetName() { return Name; } }
这样就什么问题都没有了。
相关文章推荐
- 用@property声明的成员属性_xx在重写了get方法以后,再重写set方法,get会报错,提示_xx不存在。困扰已久,望解答
- java将属性设置为私有,在给其添加get/set方法和直接把属性设置成public有什么区别
- ios基础之属性set get方法同时重写报错的问题
- category使用 objc_setAssociatedObject/objc_getAssociatedObject 实现添加属性
- category使用 objc_setAssociatedObject/objc_getAssociatedObject 实现添加属性
- category使用 objc_setAssociatedObject/objc_getAssociatedObject 实现添加属性
- 在MyEclipse中批量为属性添加get和set方法
- 设置eclipse中自动添加get,set的注释为字段属性的注释
- category使用 objc_setAssociatedObject/objc_getAssociatedObject 实现添加属性
- category使用 objc_setAssociatedObject/objc_getAssociatedObject 实现添加属性
- objc_runtime给类目添加属性关联(objc_setAssociatedObject、objc_getAssociatedObject)
- Struts2的属性boolean值的转换和封装和MyEclipse对boolean值自动添加get(),set()
- category使用 objc_setAssociatedObject/objc_getAssociatedObject 实现添加属性
- javaEE数据库查询数据时,bean对象需要添加属性的set、get方法,否则查找不到
- category使用 objc_setAssociatedObject/objc_getAssociatedObject 实现添加属性
- mybatis:延迟加载时不要在get/set方法上面添加final关键字(原创)
- JavaScript基础 为body节点下的第一个子节点p 添加style属性 添加背景颜色 firstChild setAttribute
- javascript 获取和设置属性getAttribute setAttribute
- ios 关于set方法和get方法重写的问题
- 使用PHP魔术方法实现属性的set、get方法