抽象基本クラスがあり、この親クラスから継承する各クラスで異なる値を持つフィールドまたはプロパティを宣言したいと考えています。
基本クラスで定義して、基本クラスのメソッドで参照できるようにします。たとえば、ToString をオーバーライドして、「このオブジェクトはプロパティ/フィールド型です」と言うようにします。これを行うには3つの方法がありますが、疑問に思っていました-これを行うための最良の方法または受け入れられている方法は何ですか? 初心者の質問です、すいません。
オプション 1:
抽象プロパティを使用し、継承されたクラスでオーバーライドします。これは、強制されることでメリットがあり (オーバーライドする必要があります)、クリーンです。しかし、フィールドをカプセル化するのではなくハードコード値を返すのは少し間違っているように感じます。これは単なるコードではなく数行のコードです。また、「セット」の本体を宣言する必要がありますが、それはそれほど重要ではありません (おそらく、私が気付いていないことを回避する方法があります)。
abstract class Father
{
abstract public int MyInt { get; set;}
}
class Son : Father
{
public override int MyInt
{
get { return 1; }
set { }
}
}
オプション 2
public フィールド (または保護フィールド) を宣言し、継承されたクラスで明示的にオーバーライドできます。以下の例では、「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#を理解し始めたばかりで、経験のある人にこれを尋ねたかった.