2

StackOverflow の優秀な皆さん、こんにちは。

私はC#クラスの継承と複数のコンストラクターに慣れてきましたが、Googleで検索できるような質問をすることはできません。

ここに私が持っているものがあります:

public class Order: OtherOrder
{

    private OtherOrderManager _om;

    public Order()
    {
        if (_om == null)
            _om = new OtherOrderManager();
    }

    public Order(int orderID)
        : base()
    {

    }
}

明らかに、次のようなことができるようになりました。

Order order = new Order();
order.Member_From_OtherOrder_Class = "bleh";

しかし、コンストラクターで実装しようとしているのは次のとおりです。

public class Order: OtherOrder
{

private OtherOrderManager _om;

public Order()
{
    if (_om == null)
        _om = new OtherOrderManager();
}

public Order(int orderID)
    : base()
{
   this = (Order)_om.GetOrder(orderID); //Returns an instance of OtherOrder
   //Basically, I want to populate all the members of Order() interited
   //from OtherOrder and fill them with data returned by this call.
}

}

明らかに、「これ」は読み取り専用であるため、コンパイルさえしません。私が探しているものを説明する技術的な表現はありますか? それは可能ですか?

ありがとう!

編集: リフレクションを使用してすべてのメンバーをループし、この方法で値を取得/設定すると思います。

4

3 に答える 3

5

あなたが達成しようとしていることについては少しあいまいですが、おそらくコピーコンストラクターでファクトリーを使用する方法に沿って何かを使用したいと思うかもしれません。基本的に、コピー コンストラクターは、継承チェーンに沿ってコピーを使用してデータを入力する簡単な手段を提供します。

次の基本クラスを検討してください。

public abstract class OrderBase
{
    public int OrderID { get; private set; }
    public string Name { get; protected set; }

    public OrderBase()
    {

    }

    public OrderBase(OrderBase copiedOrder)
    {
        this.OrderID = copiedOrder.OrderID;
        this.Name = copiedOrder.Name;
    }
}

(どこかで必要になると思うので、パラメータなしのコンストラクタをそこに残しました)

そのため、OrderBase別のインスタンスを渡すことでインスタンス化できOrderBaseます。そのコンストラクター内で、コピーするプロパティがわかり、コンパイル時にチェックされます。

サブクラスは次のようになります。

public class CustomOrder : OrderBase
{
    public Guid CustomID { get; private set; }

    public CustomOrder()
    {

    }

    public CustomOrder(CustomOrder copiedOrder)
        : base(copiedOrder)
    {
        this.CustomID = copiedOrder.CustomID;
    }
}

ここでは、CustomOrder宣言されている独自のプロパティのみをコピーし、残りのコピー責任を基本クラスに渡します。チェーンにもう 1 つのクラスを追加します。

public class ValidatableCustomOrder : CustomOrder
{
    public bool IsValid { get; private set; }

    public ValidatableCustomOrder()
    {

    }

    public ValidatableCustomOrder(ValidatableCustomOrder copiedOrder)
        : base(copiedOrder)
    {
        this.IsValid = copiedOrder.IsValid;
    }
}

また、1 つのクラスが他のクラスについてあまり知らなくても、サブクラスごとに各プロパティ セットを適切に管理できることがわかります。工場は次のようになります。

public static class ValidatableCustomOrderLoader
{
    public static ValidatableCustomOrder Get(int orderID)
    {
        ValidatableCustomOrder loadedOrder = LoadOrderFromSomewhere(orderID);
        ValidatableCustomOrder copiedOrder = new ValidatableCustomOrder(loadedOrder);
        return copiedOrder
    }

    private ValidatableCustomOrder LoadOrderFromSomewhere(int orderID)
    {
        //get your order somehow
    }
}

そのため、(何らかの方法で) データを (おそらくデータベースから) ロードし、それを新しいインスタンスにコピーして、すべてのコピー コンストラクターをチェーンします。呼び出しコードは次のようになります。

int orderID = 10;
ValidatableCustomOrder order = ValidatableCustomOrderLoader.Get(orderID);

とにかく、あなたの質問/コードが少し壁から外れて曖昧に見えるので、これが特に役立つかどうかはわかりませんが、うまくいけば、いくつかのアイデアを得るのに役立ちます.

于 2012-09-11T01:47:56.040 に答える
1

2 つのアプローチが思い浮かびます: プロパティを手動でコピーします。

public Order(int orderID)
    : base()
{
   var other = (Order)_om.GetOrder(orderID);
   this.SomeProperty = other.SomeProperty; //repeat for each property/field that should be copied
}

または、コンストラクターの代わりに静的メソッドまたはファクトリ メソッドを使用します。たとえば、次のようになります。

public static Order GetOrder(int orderId)
{
    return (Order)_om.GetOrder(orderID);
}
于 2012-09-11T01:29:41.063 に答える
0

試す:

this._om = (Order)_om.GetOrder(orderID);

それが役立つことを願っています。

于 2012-09-11T01:27:42.813 に答える