1

シナリオを取る

BaseA-> SubB-> SubSubC

説明:SubSubCクラスはSubBクラスを継承します。SubBクラスはBaseAクラスを継承します

BaseA-> SubD-> SubSubE

説明:SubSubEクラスはSubDクラスを継承します。SubBクラスはBaseAクラスを継承します

後で..

そのため、BaseAとして祖父母クラスを持つクラスがたくさんあります。BaseAクラスには、すべてのメソッドに共通するいくつかのプロパティがあります。例:CustomerID、LastLogin、UniqueNameなど。

これが私が消費しているサービスでクラスがどのように設計されているかです。

私の疑問は、サービスメソッドを呼び出している間、すべてのメソッドが任意のSubSubクラスのパラメーターを期待することです。誰か教えてもらえますか?BaseAのプロパティに1つの場所で値を割り当てて、SubSubオブジェクトの作成中に、毎回ベースプロパティを入力する必要がないようにする方法はありますか?

言語としてC#を使用しています。

コード:

public class BaseA
    {
        public int CustomerId { get; set; }
        public string UniqueName { get; set; }
    }

    public class SubB : BaseA
    {
    }
    public class SubSubC : SubB
    {

    }

    public class SubD : BaseA
    {
    }
    public class SubSubE : SubD
    {

    }

    public class MyMain
    {
        public void SendRequestToService1()
        {
            (new MyServiceObject()).ServiceMethod1(new SubSubC());
        }

        public void SendRequestToService2()
        {
            (new MyServiceObject()).ServiceMethod2(new SubSubE());
        }
    }

上記のコードでは、SendRequestToService1とSendRequestToService2で、基本クラスのプロパティCustomerIdとUniqueNameを初期化する必要があります。元:

(new SubSubC(){ CustomerId=2, UniqueName="XXBB" });

多くのメソッドがある場合は、それぞれのクラスに対して毎回これらのプロパティを初期化する必要があります。基本プロパティCustomerIdとUniqueNameを1つの場所で初期化して、継承するクラス(ここではSubSubC、SubSubE)がオブジェクトの作成時に初期化する必要がないようにする方法はありますか?

4

3 に答える 3

2

次の機能をお探しですか?

    //dummy class replacing the service object and it's methods
    public class MyServiceObject
    {
        public void ServiceMethod1(SubSubC param)
        { }
        public void ServiceMethod2(SubSubE param)
        { }
    }

    public class BaseA
    {
        public int CustomerId { get; set; }
        public string UniqueName { get; set; }
    }

    public class SubB : BaseA
    {
    }
    public class SubSubC : SubB
    {
    }

    public class SubD : BaseA
    {
    }
    public class SubSubE : SubD
    {
    }

    public class MyMain
    {
        //declare the SubSub objects
        //SubSubC subSubC;
        //SubSubE subSubE;
        BaseA baseA;

        public MyMain()
        {
            //assign the values to each class in the MyMain contrsuctor
            baseA = new BaseA { CustomerId = 2, UniqueName = "XXBB" };

        }

        public void SendRequestToService1()
        {
            var subSub=new SubSubC();
            (new MyServiceObject()).ServiceMethod1(Initialize(subSub));
        }

        public void SendRequestToService2()
        {
            var subSub = new SubSubE();
            (new MyServiceObject()).ServiceMethod2(Initialize(subSub));
        }

        private T Initialize<T>(T subSub) where T:BaseA
        {
            subSub.CustomerId = baseA.CustomerId;
            subSub.UniqueName = baseA.UniqueName;
            return subSub;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyMain myMain = new MyMain();
            myMain.SendRequestToService1();
            myMain.SendRequestToService2();
        }
    }
于 2012-12-03T08:12:43.577 に答える
2

基本コンストラクターの呼び出しについて質問していますか? もしそうなら:

class SubSubC : SubB
{
    public object CProperty { get; private set; }
    public SubSubC(object cProperty, string bProperty, int id) : base(bProperty, id)
    {
        CProperty = cProperty;
    }
}
class SubB : BaseA
{
    public string BProperty { get; private set; }
    public SubB(string bProperty, int id) : base(id)
    {
        BProperty = bProperty;
    }
}
class BaseA
{
    public int ID { get; private set; }
    public BaseA(int id)
    {
        ID = id;
    }
}

それとも、メソッド内のオブジェクトの初期化について質問していますか? その場合 (前のコードとは異なり、次のコードではセッターが public であると仮定します):

void SetSubSubCProperties(SubSubC c, object cProperty, string bProperty, int id)
{
    c.CProperty = cProperty;
    SetSubBProperties(c, bProperty, id);
}
void SetSubBProperties(SubB b, string bProperty, int id)
{
    b.BProperty = bProperty;
    SetBaseAProperties(b, id);
}
void SetBaseAProperties(BaseA a, int id)
{
    a.ID = id;
}

わかりました、Alex Filipovici の答えです。別の派生クラスのインスタンスから基本クラスのプロパティをコピーして、派生クラスのインスタンスを初期化したいようです。その場合、アレックスの回答の重複を減らすために、これを行うことができます:

void Initialize(BaseA source, BaseA target)
{
    target.CustomerID = source.CustomerID;
    target.UniqueName = source.UniqueName;
}

次に、彼の例を変更するには:

public void SendRequestToService1()
{
    var subSub = new SubSubC();
    Initialize(this.baseA, subSub);
    (new MyServiceObject()).ServiceMethod1(subSub);
}

public void SendRequestToService2()
{
    var subSub = new SubSubE();
    Initialize(this.baseA, subSub);
    (new MyServiceObject()).ServiceMethod2(subSub);
}
于 2012-11-29T06:16:03.653 に答える
0

あなたの質問を理解できません。

public class A {
  public int ID { get; set; }
}

public class B : A {
}

あなたがすることができB b = new B()ますb.ID = 12


または、サービスのタイプのパラメーターを取得するメソッドがあるA場合は、同じ方法で値を変更できます。

public void doSomething(A a) {
  a.ID = 12;
}

B-のインスタンスでメソッドを呼び出しますdoSomething(new B())

于 2012-11-29T06:03:16.917 に答える