[解決済み] ゲッターのみのプロパティをオーバーライドして、セッターを追加することができないのはなぜですか?[クローズド]
質問
以下のC#コードはなぜダメなのでしょうか。
public abstract class BaseClass
{
public abstract int Bar { get;}
}
public class ConcreteClass : BaseClass
{
public override int Bar
{
get { return 0; }
set {}
}
}
CS0546 'ConcreteClass.Bar.set': 'BaseClass.Bar' にオーバーライド可能なセット・アクセサがないため、オーバーライドできない。
どうすればいいですか?
なぜなら、Baseclass のライターが、Bar は読み取り専用のプロパティでなければならないと明示的に宣言しているからです。派生物がこの契約を破って読み書きできるようにするのは意味がない。
この件に関しては、マイクロソフトに賛成です。
例えば、私が新人プログラマーで、Baseclassの派生に対抗してコードを書くように言われたとします。私は、Barが書き込めないことを前提としたものを書きました(Baseclassは、それが取得専用プロパティであることを明示しているからです)。
今、あなたの派生を使うと、私のコードは壊れるかもしれません。
public class BarProvider
{ BaseClass _source;
Bar _currentBar;
public void setSource(BaseClass b)
{
_source = b;
_currentBar = b.Bar;
}
public Bar getBar()
{ return _currentBar; }
}
BaseClass インタフェースでは Bar を設定できないので、BarProvider はキャッシュが安全であると仮定しています - Bar は変更できないので。しかし、もし派生クラスで設定が可能であれば、誰かが _source オブジェクトの Bar プロパティを外部で変更した場合、このクラスは古い値を提供することができます。ポイントは、' オープンであること、卑怯なことをしないこと、人を驚かせないこと。 '
更新情報
:
Ilya Ryzhenkovが問う「なぜインターフェースは同じルールでプレイしないのか?
うーん、考えれば考えるほど泥沼化してるなぁ。
インターフェースは、「実装がBarという名前の読み取りプロパティを持つことを期待する」という契約である。
個人的に
インターフェイスを見たときに、読み取り専用という前提を立てることはあまりないですね。インターフェースでget-onlyのプロパティを見たとき、私は「どんな実装でもこの属性Barを公開するだろう」と読み取ります。もちろん、技術的には契約を破っているわけではないのだが、それ以上のことをしているわけだ。だから、ある意味正しいんだけどね。最後に「誤解が生じないように、できるだけ難しくする」と言っておこう。
関連
-
[解決済み】「The breakpoint will not currently be hit」を改善するには?このドキュメントにはシンボルが読み込まれていません。" という警告はどうすれば改善されますか?
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み] Could not find a part of the path ... binroslyncsc.exe
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] EqualsメソッドがオーバーライドされたときにGetHashCodeをオーバーライドすることが重要な理由は何ですか?
-
[解決済み] フィールドとプロパティの違いは何ですか?
-
[解決済み] プロパティとゲッターとセッターの使い分け
-
[解決済み】大文字・小文字を区別しない「Contains(string)
-
[解決済み】TをEnumに拘束するGenericメソッドの作成
-
[解決済み】乱数発生器が1つの乱数しか発生させない。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み】C#におけるtypedefの等価性
-
[解決済み】SmtpException: トランスポート接続からデータを読み取れません:net_io_connectionclosed
-
[解決済み] [Solved] 不正な文字列値: '\xEFxBFxBD' for column
-
[解決済み】Swashbuckle/Swagger + ASP.Net Core: "Failed to load API definition" (API定義の読み込みに失敗しました
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み] 関数を終了するには?
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない