4

私の目標は、ほとんどのシナリオでオブジェクトが完全なインターフェイスのサブセットである「読み取り専用インターフェイス」を介して使用されるようにすることです。

  • constたとえば、C++ を使用している場合は、オブジェクトを返すだけです。
  • C# では、インターフェイスでこれを実現できれば、読み取り専用のインターフェイスを実装して、どこでも使用できます。ただし、インターフェイスでは許可されていない演算子のオーバーロードが必要です。そのため、抽象基本クラスを使用する必要があります。
  • しかし、抽象基本クラスを定義すると、派生型のアクセシビリティを変更することはできません。

では、C# で目標を達成するにはどうすればよいでしょうか。

4

4 に答える 4

4

書き込み操作をインターフェイスに配置してから、抽象基本クラスに明示的に実装するとどうなりますか? これは 100% 完璧な解決策ではありません (オブジェクトを変更インターフェースにキャストすることはできます) が、ほとんどの場合、誰かが誤って変更メソッドを呼び出すのを防ぐことができます。

于 2008-12-16T23:20:15.773 に答える
3

オペレーターのオーバーロードが本当に必要ですか? ここでは、シンタックス シュガーについて説明します。また、すべての .NET 言語が同じように演算子のオーバーロードを利用しているわけではありません。したがって、演算子のオーバーロードを使用すると、効果的にコードを言語固有にすることになります。

読み取り専用インターフェイスを実装し、演算子のオーバーロード要件を削除します。

于 2008-12-16T23:50:18.613 に答える
2

オブジェクトの状態を介して読み取り専用の動作を実装し、変更メソッドが呼び出された場合に例外をスローすることができますか?

于 2008-12-16T23:14:00.857 に答える
1

誰かが私がやったことに興味を持っているなら、私は最終的にインターフェイスではなく抽象クラスを選び、適切なアクセサーを取得するために派生クラスのメソッドを非表示にしました:

同様に、基本抽象クラス (読み取り専用インターフェイス) では:

protected double accuracy;
public double Accuracy { get { return accuracy; } }

派生クラス:

public new double Accuracy
{
    get { return accuracy; }
    set { accuracy = value; }
}

もちろん、「new」キーワードは見苦しいですが、この場合はそれで十分です。

于 2008-12-17T01:03:57.373 に答える