抽象基本クラスがあり、この親クラスから継承する各クラスで異なる値を持つフィールドまたはプロパティを宣言したい。
基本クラスのメソッドで参照できるように、それを基本クラスで定義したいと思います。たとえば、ToStringをオーバーライドして、「このオブジェクトはプロパティ/フィールドタイプです」と言っています。これを行う方法は3つありますが、疑問に思っていました。これを行うための最良の方法または受け入れられている方法は何ですか。初心者の質問、申し訳ありません。
オプション1:
抽象プロパティを使用し、継承したクラスでそれをオーバーライドします。これは強制されることでメリットがあり(オーバーライドする必要があります)、クリーンです。しかし、フィールドをカプセル化するのではなく、ハードコード値を返すのは少し間違っているように感じられ、単なるコード行ではなく、数行のコードです。また、「セット」の本体を宣言する必要がありますが、それはそれほど重要ではありません(そして、私が知らないものを回避する方法がおそらくあるでしょう)。
abstract class Father
{
abstract public int MyInt { get; set;}
}
class Son : Father
{
public override int MyInt
{
get { return 1; }
set { }
}
}
オプション2
パブリックフィールド(または保護フィールド)を宣言し、継承したクラスで明示的にオーバーライドできます。以下の例では、「new」を使用するように警告が表示され、おそらくそれを実行できますが、それは間違っていると感じ、多型性を壊します。良い考えではないようです...
abstract class Mother
{
public int MyInt = 0;
}
class Daughter : Mother
{
public int MyInt = 1;
}
オプション3
保護されたフィールドを使用して、コンストラクタで値を設定できます。これはかなり整頓されているように見えますが、コンストラクターが常にこれを設定し、複数のオーバーロードされたコンストラクターがあると、いくつかのコードパスが値を設定しない可能性が常にあることを保証する私に依存しています。
abstract class Aunt
{
protected int MyInt;
}
class Niece : Aunt
{
public Niece()
{
MyInt = 1;
}
}
これは少し理論的な質問です。唯一の安全なオプションであるため、答えはオプション1である必要があると思いますが、私はC#に慣れつつあり、より経験のある人にこれを尋ねたかったのです。