2009-09-09 100 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