2009-09-09 102 views
0

我正在探索這個,看看這個是否有意義。例如,我有2個抽象對象叫做:Customer和Tender。關係是一個客戶可以有很多招標。面向對象的方法C#

如何能夠做到在TestClient的應用程序如下:

  1. customer.InTender[0].ID = ???

    用什麼方法來處理來處理呢?我需要通過CustomerIDCustomer構造函數來實現這個還是...?

  2. 如果我要得到所有投標針對特定客戶我應該這樣做:

    customer.InTender.Get() 
    
  3. 如何區分所有投標VS之間的所有客戶投標(3點)。我猜這會是這樣的。一個帶有客戶ID,另一個沒有?

    inTender.Get() 
    

public abstract class Customer 
{ 
    protected Int64 id; 
    protected string name; 

    protected ArrayList tender; 

    public abstract ArrayList Tender 
    { 
     get; 
     set; 
    } 

    public abstract Int64 ID 
    { 
     get; 
     set; 
    } 

    public abstract string Name 
    { 
     get; 
     set; 
    } 


    public abstract bool Update(); 

    public abstract bool Add(); 

    public abstract bool Delete(); 
} 

public class CorporateCustomer : Customer 
{ 
    public CorporateCustomer() 
    {} 

     public override ArrayList Tender 
     { 
      get 
      { 
       return tender 
      } 
      set 
      { 
       tender = value; 
      } 
     } 

    public override Int64 ID 
     { 
      get 
      { 
       return id; 
      } 
      set 
      { 
       id = value; 
      } 
     } 

     public override string Name 
     { 
      get 
      { 
       return name; 
      } 
      set 
      { 
       name = value; 
      } 
     } 

    public override bool Update() 
    { 
    return true; 
    } 

    public override bool Add() 
    { 
    return true; 
    } 

    public override bool Delete() 
    { 
    return true; 
    } 
} 


public abstract class Tender 
{ 
    protected Int64 id; 
    protected string name; 

    public abstract bool Update(); 

    public abstract bool Add(); 

    public abstract bool Delete(); 

} 

public class InTender : Tender 
{ 
    public InTender() 
    {} 


    public override Int64 ID 
     { 
      get 
      { 
       return id; 
      } 
      set 
      { 
       id = value; 
      } 
     } 

     public override string Name 
     { 
      get 
      { 
       return name; 
      } 
      set 
      { 
       name = value; 
      } 
     } 

    public override bool Update() 
    { 
    return true; 
    } 

    public override bool Add() 
    { 
    return true; 
    } 

    public override bool Delete() 
    { 
    return true; 
    } 
} 
+0

這可能是無關緊要的,但是我可以更好地理解您要解決的問題,「嫩」是指什麼? – jeremyalan 2009-09-09 03:37:48

+4

看起來像學校作業。 – Vadim 2009-09-09 03:39:45

+0

請縮進所有代碼一個額外的4個空格,將整個班級放在代碼框中。 – 2009-09-09 03:40:32

回答

2

1)不要使用ArrayList,它被作爲貶值.NET 2.0。您應該使用List,IList或Dictionary。

此外,客戶確定似乎是具體類型。你打算讓多個Customer類都繼承它嗎?如果不是,請刪除摘要。其他課程也一樣。

2)查找Repository對象和LazyLoading。 Davy Bryon在構建自己的DAL方面有很好的系列。 http://davybrion.com/blog/2009/08/build-your-own-data-access-layer-lazy-loading/

但是,客戶應該立即擁有所有的投標,或者您應該有一個服務,讓他們爲您。我不贊成讓實體知道他們的持久性。

無論如何,一般的方法是有一個單獨的Repository類,它具有獲取所需數據所需的方法。

public class CustomerRepository 
{ 
    public List<Customer> GetAllCustomers() { .... } 
    public List<Tenders> GetTendersForCustomer(Customer customer) { .... } 

} 
+0

很好的回答克里斯。 – 2009-09-09 03:57:58

+0

1)我開始在課堂上使用Abstrac。我曾經直接在類的實現上編碼。 2)用你給我的代碼,假設我想在myTestApp中測試這個類: List tenderColl; CustomerRepository customer = new CustomerRepository(); tenderColl = customer.GetTenders(); 但我想在這樣的客戶: CorporateCUstomer客戶=新客戶(21); Int64 tenderID = customer.Tender [0] .ID; //數組1的TenderID 字符串tenderName = customer.Tender [0] .Name //數組1的TenderName – dcpartners 2009-09-09 04:23:45

+0

您正在此處查找ActiveRecord樣式模式。傳統上這是糟糕的設計,因爲你在對象中混合責任。單一責任是關鍵。一個對象要麼保存它的數據,要麼知道如何堅持自己。儘量不要混淆兩者。最終的結果是你得到的代碼很難測試,但也很難修改 - 代碼中的代碼太多了。 – 2009-09-09 04:54:29

0

我認爲標準Tender類和標準Customer類屬性List <Tender>應該足夠了。我不明白你爲什麼需要抽象類和繼承。

class Tender {} 

class Customer { 
    List <Tender> tenders; // would be null if customer has no tenders 
    .... 
} 
+0

招標可能是「PreTender」,「PostTender」,「InTender」 – dcpartners 2009-09-09 04:28:29