2011-01-06 5 views
3

基本インターフェイスで具体的なクラスの値に読み取り専用アクセスが可能な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 

私は書き込みアクセス権を持っているために、基本クラスを望んでいません。しかし、私は具体的なクラスに読み書きアクセスを提供したい。この仕事をする方法はありますか?それはまた、非抽象機能が含まれているよう

おかげで、 PaulH残念ながら


は、Baseは、インターフェースに変更することはできません。私は元の問題の説明に入れるべきだと思っていたはずのもの。

public class Foo : Base 
{ 
    DateTime start_time_; 

    public override DateTime StartTime 
    { 
     get { return start_time_; } 
    } 

    internal void SetStartTime 
    { 
     start_time_ = value; 
    } 
} 

それは私が好きなように素敵ではないのですが、それは動作します:

public abstract class Base 
{ 
    public abstract DateTime StartTime { get; } 

    public void Buzz() 
    { 
     // do something interesting... 
    } 
} 

私のソリューションは、これを行うことです。

答えて

0

私のソリューションは、これを行うことです。

3

抽象クラスよりもインターフェイスを使用しない理由は何ですか?

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; } 
     } 
    } 
+0

+1私よりも速く:-) –

+2

インターフェイスは抽象基本クラスの代わりではないため、 –

0

基本クラスから派生させるときはこれを行うことはできませんが、インターフェイスを実装するときに行うことはできます。

代わりにインターフェイスで基本クラスを置き換えることができますので、動作します。

1

あなたは、このようにそれを行うことができます。

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; 
     } 
    } 
} 

必要に応じて、インターフェイスを使用しています。

public class Foo : Base 
{ 
    DateTime start_time_; 

    public override DateTime StartTime 
    { 
     get { return start_time_; } 
    } 

    internal void SetStartTime 
    { 
     start_time_ = value; 
    } 
} 

それは私が好きなように素敵ではないのですが、それは動作します:

関連する問題