[解決済み] サブクラスでのフィールドやプロパティのオーバーライド
質問
抽象的な基底クラスがあり、この親クラスを継承する各クラスで異なる値を持つフィールドまたはプロパティを宣言したい。
ベースクラスで定義して、ベースクラスのメソッドで参照できるようにしたい。たとえば、ToStringをオーバーライドして、"このオブジェクトの型は プロパティ/フィールド となります。 これを行うには3つの方法がありますが、これを行うための最良の方法または受け入れられた方法は何でしょうか?初心者の質問です、すみません。
オプション1:
抽象プロパティを使用し、継承されたクラスでそれをオーバーライドします。これは強制力があり(オーバーライドしなければならない)、クリーンであることが利点です。しかし、フィールドをカプセル化するのではなく、ハードコードの値を返すのは少し間違っているように感じますし、ちょうどではなく、数行のコードです。また、私は "set" のためにボディを宣言しなければなりませんが、それはあまり重要ではありません(そして、私が知らないそれを回避する方法がおそらくあります)。
abstract class Father
{
abstract public int MyInt { get; set;}
}
class Son : Father
{
public override int MyInt
{
get { return 1; }
set { }
}
}
オプション2
publicフィールド(またはprotectedフィールド)を宣言して、それを継承したクラスで明示的にオーバーライドすることができるんだ。下の例では "new" を使うように警告が出るので、おそらくそうすることができますが、間違っていると感じますし、肝心のポリモーフィズムを壊してしまいます。良いアイデアとは思えませんね...。
abstract class Mother
{
public int MyInt = 0;
}
class Daughter : Mother
{
public int MyInt = 1;
}
オプション3
protectedフィールドを使用し、コンストラクタで値を設定することができます。しかし、コンストラクタが常にこの値を設定するようにしなければなりません。また、複数のオーバーロードされたコンストラクタを使用する場合、一部のコードパスで値が設定されない可能性があります。
abstract class Aunt
{
protected int MyInt;
}
class Niece : Aunt
{
public Niece()
{
MyInt = 1;
}
}
ちょっと理論的な質問ですが、答えは選択肢1しかないと思います。 セーフ しかし、私はC#を使い始めたばかりで、より経験豊富な人々にこれを尋ねたいと思いました。
どのように解決するのですか?
3つのソリューションのうち、唯一 オプション1 は ポリモーフィック .
フィールド単体でのオーバーライドはできません。これはまさに オプション2 が返されます。 新しい キーワードの警告を表示します。
警告に対する解決策は、"new "キーワードを追加することではなく、オプション1を実行することです。
フィールドをポリモーフィックにする必要がある場合、それをプロパティでラップする必要があります。
オプション3 は、ポリモーフィックな動作が必要ない場合は、OKです。しかし、実行時に MyInt プロパティがアクセスされた場合、派生クラスは返される値を制御できないことを覚えておく必要があります。ベースクラスはそれ自体でこの値を返すことができるのです。
これは、プロパティの真のポリモーフィック実装がどのように見えるかであり、派生クラスが 制御 .
abstract class Parent
{
abstract public int MyInt { get; }
}
class Father : Parent
{
public override int MyInt
{
get { /* Apply formula "X" and return a value */ }
}
}
class Mother : Parent
{
public override int MyInt
{
get { /* Apply formula "Y" and return a value */ }
}
}
関連
-
[解決済み】C#はJavaのcharAt()と同等?)
-
[解決済み] リフレクションを使用して文字列からプロパティ値を取得する
-
[解決済み] JavaScriptでオブジェクトのキー/プロパティの数を効率的にカウントする方法
-
[解決済み] なぜJavaにはtransientフィールドがあるのですか?
-
[解決済み] あるコンストラクタを別のコンストラクタから呼び出す
-
[解決済み] by lazy" と "lateinit" を使ったプロパティの初期化
-
[解決済み] パブリックフィールドとオートマチックプロパティ
-
[解決済み】C#には拡張プロパティがある?
-
[解決済み】C#でprivateプロパティを使用する理由はあるのでしょうか?
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] 1つ以上のエンティティで検証に失敗しました。詳細は'EntityValidationErrors'プロパティを参照してください [重複]。
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み] UnityでOnCollisionEnterが呼ばれない
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。