C# で C++ const の動作を実際に再現できます。手動で行うだけです。
いずれにせよFoo
、呼び出し元がその状態を変更できる唯一の方法は、メソッドを呼び出すか、プロパティを設定することです。
たとえば、Foo
タイプは次のFooClass
とおりです。
class FooClass
{
public void MutateMyStateYouBadBoy() { ... }
public string Message
{
get { ... }
set { ... }
}
}
したがって、あなたの場合、彼らがMessage
プロパティを取得することを喜んでいますが、それを設定することはできません。また、彼らがそのメソッドを呼び出すことに満足していないことは間違いありません。
したがって、彼らができることを説明するインターフェイスを定義します。
interface IFooConst
{
public string Message
{
get { ... }
}
}
mutating メソッドを省略し、プロパティの getter のみを残しました。
次に、そのインターフェイスを のベース リストに追加しますFooClass
。
Foo
プロパティを持つクラスに、フィールドがあります。
private FooClass _foo;
プロパティのゲッター:
public IFooConst Foo
{
get { return _foo; }
}
これは基本的に、C++const
キーワードが自動的に行うことを正確に手動で再現します。疑似 C++ の用語では、型の参照は、メンバーとしてマークされたconst Foo &
メンバーのみを含む、自動生成された型のようなものです。これを C# の理論的な将来のバージョンに変換すると、次のように宣言できます。Foo
const
FooClass
class FooClass
{
public void MutateMyStateYouBadBoy() { ... }
public string Message
{
get const { ... }
set { ... }
}
}
私が実際に行ったことは、1 つの安全なメンバーに新しいキーワードをタグ付けするIFooConst
ことによって、 の情報を にマージしたことだけです。したがって、ある意味では、 const キーワードを追加しても、このパターンへの正式なアプローチを除いて、言語にはあまり追加されません。FooClass
const
次にconst
、オブジェクトへの参照があるFooClass
場合:
const FooClass f = GetMeAFooClass();
の const メンバーのみを呼び出すことができますf
。
FooClass
定義が公開されている場合、呼び出し元は を にキャストできることに注意してIFooConst
くださいFooClass
。しかし、彼らは C++ でもそれを行うことができます - それは「キャストアウェイconst
」と呼ばれ、 と呼ばれる特別な演算子を伴いconst_cast<T>(const T &)
ます。
また、製品のバージョン間でインターフェイスを簡単に進化させることができないという問題もあります。あなたが定義したインターフェイスをサード パーティが実装する可能性がある場合 (サード パーティがそれを見ることができれば自由に実行できます)、将来のバージョンで新しいメソッドを追加することはできません。他のユーザーがコードを再コンパイルする必要はありません。しかし、それは、他の人が構築できる拡張可能なライブラリを作成している場合にのみ問題になります。ビルトインconst
機能がこの問題を解決するかもしれません。