1

私が読んだことから、クラスを基本クラスから継承クラスに変換する良い方法はないようです。

この質問の回答に従って、基本クラスのインスタンスをパラメーターとして受け取るコンストラクターを作成しました。

コンストラクタは次のようになります。

public DerivedClass(BaseClass base) {
    this.Id = base.Id;
    this.Foo = base.Foo;
    // ..
    this.NewProperty = SomeNewValue;
}

これは、基本クラスが新しいプロパティを取得した場合、そのプロパティをコピーするために派生クラスのコンストラクターも変更する必要があることも意味します。

派生クラスが基本クラスから継承されているという事実を利用して、このコンストラクターの脆弱性を軽減する方法はありますか?

4

2 に答える 2

4

継承を完全に把握しておらず、何をする必要があるかを考えすぎているようです。

基本クラスのインスタンスをパラメーターとして受け取るコンストラクターを作成しました。

基本クラスを拡張 (継承) する場合は、これを行う必要はありません。クラスをラップする場合にのみ行います。

派生クラスが基本クラスから継承されているという事実を利用して、このコンストラクターの脆弱性を軽減する方法はありますか?

はい: コンストラクターのオーバーロードを使用します。この基本クラスを考えると:

public class MyBase
{
    public virtual string Name { get; set;}
}

あなたはこれを行うことができます:

public class MyExtendedClass : MyBase 
{
    public MyExtendedClass(string name)
    {
        Name = name;
    }
}

ただし、コンストラクターのパラメーターが基本クラスのコンストラクターに渡される、次のようなコンストラクターのオーバーロードを活用することをお勧めします。

public class MyBase
{

    public MyBase(string name)
    {
        Name = name;
    }

    public virtual string Name { get; set;}
}

public class MyExtendedClass : MyBase 
{
    public MyExtendedClass(string name) : base (name) {   }
}

不変にしたいプロパティのコンストラクターに値を渡す傾向があります。他のものについては、インライン初期化を利用できます。

var myNewClass = new MyExtendedClass() { Name = "blah" };
于 2013-04-02T22:24:35.763 に答える
0

Could you not add a protected constructor to the base class that carries out the assignments and then just pass the base class down to it as a parameter:

protected BaseClass(BaseClass source)
{
    this.Id = source.Id;
    this.Foo = source.Foo;
    ...
}

Thereby keeping the code to duplicate the base class in the base class itself?

于 2013-04-02T22:25:22.110 に答える