21
public class SuperCar: Car
{
     public bool SuperWheels { get {return true; } }
}

public class Car 
{
     public bool HasSteeringWheel { get {return true;} }
}

派生スーパーカーの基本クラスを設定するにはどうすればよいですか?

たとえば、次のように単純に SuperCars の基本クラスを設定したいとします。

public void SetCar( Car car )
{
SuperCar scar = new SuperCar();
car.Base = car; 
}

基本的に、Car オブジェクトがある場合、SuperCar オブジェクトをセットアップするために、車のすべてのプロパティを手動で繰り返し処理したくありません。これが唯一の方法だと思いますが、他の方法で実行できる場合ははるかに良いでしょう。

4

7 に答える 7

14

私はサブクラスでこのようなものを使用していますが、それは私にとってはうまくいきます:

using System.Reflection;
.
.
.
/// <summary> copy base class instance's property values to this object. </summary>
private void InitInhertedProperties (object baseClassInstance)
{
    foreach (PropertyInfo propertyInfo in baseClassInstance.GetType().GetProperties())
    {
        object value = propertyInfo.GetValue(baseClassInstance, null);
        if (null != value) propertyInfo.SetValue(this, value, null);
    }
}
于 2013-09-25T16:16:11.380 に答える
4

私があなたの質問を正しく理解している場合(そして、私が完全に理解しているとは限りません)、次のようなことを行うことで、必要な動作を得ることができます。

class Car {
    public bool CarProperty { get; set; }
    // regular constructor
    public Car() {

    }
    // "copy" constructor
    public Car(Car c) {
        CarProperty = c.CarProperty;
    }
}

class SuperCar : Car {
    public bool SuperCarProperty { get; set; }
    // regular constructor
    public SuperCar() {
    }
    // "copy" constructor
    public SuperCar(Car c) : base(c) {
        SuperCar sc = c as SuperCar;
        if(sc != null) {
            SuperCarProperty = sc.SuperCarProperty;
        }
    }

次に、これを行うことができます:

public void SetCar(Car car) {
    SuperCar scar = new SuperCar(car);
}

「コピー」コンストラクターでは、2 つのオブジェクトが同じメンバー (参照) を共有してはならない場合に共有するような方法でプロパティをコピーしないように十分に注意する必要があることに注意してください。

しかし、これであなたの目標は何ですか?

于 2011-01-28T01:22:37.927 に答える
2

これは不可能です。

プロパティを手動で設定する必要があります。

于 2011-01-28T01:05:30.100 に答える
2

別のクラスの内容をコピーすることはできますが、直接設定することはできません。コピー コンストラクターと呼ばれるものを使用した以下の例を参照してください。

class Car
{
    string model;
    public Car(string model) { this.model = model; }
    protected Car(Car other) { this.model = other.model; }
    string Model { get; set; }
}

class SuperCar : Car
{
    public SuperCar(Car car) : base(car) { }
    public SuperCar(string model) : base(model) { }
    bool IsTurbo { get; set; }
}

base()キーは、コンストラクター宣言の後のキーワードです。

于 2011-01-28T02:33:15.797 に答える
1

全体的に役立つコメントがたくさん。短い答えはpstによって与えられたと思いますが、これは正しいと思います。

いいえ。簡単な理由:個別のベースオブジェクトはありません。(object)this ==(object)baseは常にtrueです。ただし、リフレクション(およびその他の手段)によってクローン作成/コピーを実行する方法はあります。おそらく本当に欲しいものを説明してください

したがって、オートマッパーツールを使用するという彼の提案も非常に有用であり、基本的に私が探していたものでした。

于 2011-10-17T23:32:27.270 に答える
0

まず第一に、各 SuperCar オブジェクトは他とは異なります。継承は、関連するオブジェクトの共通の動作を定義するのに役立ちます。それらが同じオブジェクトであることを意味するわけではありません。タイプの各オブジェクトには、独自の構築プロセスがあります。子オブジェクトが作成される前に、継承階層に従って基底クラスのオブジェクトが作成されます。すべての SuperCar オブジェクトに共通のプロパティを使用する場合は、SuperCar インスタンス内で Car オブジェクトの個別のインスタンスを維持し、共通の car オブジェクトを SuperCar の car オブジェクトに割り当て、ベース Car から派生したプロパティをオーバーライドする必要があります。オブジェクトを小道具にリダイレクトします。内部 Car オブジェクトの。

public class SuperCar: Car
{
     public bool SuperWheels { get {return true; } }

     Car carInstance = null;
     public void SetCar( Car car )
     {
         carInstance = car; 
     }
}

しかし、私はまだ、あなたがやりたいと思っているこのデザインには何か問題があると信じています. これを行う理由について全体像をお知らせいただければ、お客様の要件に対応するためのより良い設計を考え出すことができます.

于 2011-01-28T01:26:15.013 に答える
0

反映されたプロパティをコピーするよりも詳細に制御したい場合は、Builder パターンを適用してみてください。T は、BaseClass から派生した任意のクラスにすることができます。

 public static T BuildNew<T>(BaseClass baseClass) where T : BaseClass, new()
 {
    return new T
    {
        Property1 = baseModel.Property1,
        Property2 = baseModel.Property2,
    };
 }
于 2017-11-04T04:51:43.310 に答える