为只定义读的接口实现读/写字段
Posted
技术标签:
【中文标题】为只定义读的接口实现读/写字段【英文标题】:implementing a read/write field for an interface that only defines read 【发布时间】:2011-01-06 21:02:31 【问题描述】:我有一个 C# 2.0 应用程序,其中基接口允许对具体类中的值进行只读访问。但是,在具体类中,我希望对该值具有读/写访问权限。所以,我有一个这样的实现:
public abstract class Base
public abstract DateTime StartTime get;
public class Foo : Base
DateTime start_time_;
public override DateTime StartTime
get return start_time_;
internal set start_time_ = value;
但是,这给了我错误:
Foo.cs(200,22): error CS0546: 'Foo.StartTime.set': cannot override because 'Base.StartTime' does not have an overridable set accessor
我不希望基类具有写访问权。但是,我确实希望具体类提供读/写访问。有没有办法让这个工作?
谢谢, 保罗H
不幸的是,Base
不能更改为接口,因为它还包含非抽象功能。我应该考虑在原始问题描述中添加一些内容。
public abstract class Base
public abstract DateTime StartTime get;
public void Buzz()
// do something interesting...
我的解决方案是这样做:
public class Foo : Base
DateTime start_time_;
public override DateTime StartTime
get return start_time_;
internal void SetStartTime
start_time_ = value;
它没有我想要的那么好,但它确实有效。
【问题讨论】:
【参考方案1】:有什么理由不使用抽象类的接口?
public interface Base
DateTime StartTime get;
public class Foo : Base
DateTime start_time_;
public DateTime StartTime
get return start_time_;
internal set start_time_ = value;
【讨论】:
因为接口不能替代抽象基类:/【参考方案2】:你可以这样做:
public abstract class Base
public abstract DateTime StartTime get; internal set;
public class Foo : Base
DateTime start_time_;
public override DateTime StartTime
get
return start_time_;
internal set
start_time_ = value;
(可选)使用接口。
【讨论】:
【参考方案3】:从基类派生时不能这样做,但在实现接口时可以这样做。
因此,如果您可以将基类替换为接口,那么它将起作用。
【讨论】:
【参考方案4】:我的解决方案是这样做:
public class Foo : Base
DateTime start_time_;
public override DateTime StartTime
get return start_time_;
internal void SetStartTime
start_time_ = value;
它没有我想要的那么好,但它确实有效。
【讨论】:
以上是关于为只定义读的接口实现读/写字段的主要内容,如果未能解决你的问题,请参考以下文章