2012-11-29 44 views
1

採取情景公共基類的初始化

BaseA - > SUBB - > SubSubC

說明:SubSubC類繼承SUBB類。該subB的類繼承BaseA類

BaseA - >的SubD - > SubSubE

說明:SubSubE類繼承型SubD類。該subB的類繼承BaseA類

So..on ..

所以有很多類,有其宏大的父類爲BaseA。 BaseA類具有一些對所有方法都通用的屬性。例如:CustomerID,LastLogin,UniqueName等。

這是我在使用的服務中設計的類。

我的疑惑是在調用服務方法時,所有方法都會期望任何SubSub類的參數。任何人都可以告訴我,是否有任何方法,如果我可以在一個地方給BaseA的屬性賦值,以便在創建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,以便繼承類(SubSubC,SubSubE在這裏)在創建對象時不需要初始化?

+1

不知道問題是什麼。看起來像「我想在一個函數中初始化'BaseA'類的實例的屬性,我可以編寫它嗎?」...解決您正面臨的問題的示例代碼將有所幫助。 –

回答

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(); 
     } 
    } 
+0

您明白了,但您在MyMain構造函數中多次指定了CustomerId,UniquName。在我的情況下,SubIsubC和SubSubE的CustomerId和UniqueName將與Session相同(可能來自Session)。在這種情況下,你可以讓我知道,而不是每次創建subsubC,subsubE等對象時分配CustomerId和UniqueName屬性,我可以在一個地方做到這一點,所以我不需要在創建對象時一次又一次地分配它。 – clklachu

+0

現在呢? –

+0

是它的好。但請注意,正如我的問題中提到的,這些是我在使用的服務中定義的類。所以我沒有選擇來改變它。 – clklachu

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())

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; 
    } 
} 

或者你是否在初始化方法中的對象問?如果是的話(假設制定者都在下面的代碼公開,不像在前面):

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; 
} 

好吧,亞歷克斯Filipovici的答案,它看起來像你想通過複製基類來初始化派生類的一個實例來自不同派生類的實例的屬性。在這種情況下,爲了減少在Alex的答案重複,你可以這樣做:

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); 
} 
+0

謝謝你的回覆。這是爲了初始化繼承的類中的基類屬性。我在服務中有這些類,我想在將Child類作爲參數發送到服務之前,初始化基本屬性(在一個常見的地方)。 – clklachu

+0

@clklachu所以......答案是否足夠,還是不知何故錯過了你的觀點? – phoog

+0

我覺得可能有更好的答案,可以適合我的情況。 – clklachu