为只定义读的接口实现读/写字段

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;
    

它没有我想要的那么好,但它确实有效。

【讨论】:

以上是关于为只定义读的接口实现读/写字段的主要内容,如果未能解决你的问题,请参考以下文章

实现 Parcelable 接口时如何读/写布尔值?

c#如何在父类(或是接口)当中定义一个子类必须要重写的字段(属性)?

C#中为啥使用字段封装

接口implements

接口测试方案怎么写

mysql————Innodb的可重复读的情况下如何避免幻读?