如何调用相同的方法但不同的对象流?

时间:2009-09-10 06:56:56

标签: c#

我有3个抽象类(Customer,Tender,Site)。对于Customer,继承了CorporateCustomer等类。对于Tender有PreTender,InTender,PostTender的具体课程。网站有CorporateSite类。

我已经很好地布局了我们的方法,属性,这些对象和测试之间的关系很好。

在MyTestApp实施中:

Customer customer = new CorporateCustomer(35); // ==> This will pass CustomerID = 35
string customerTenderName = customer.InTenders[0].Name; // ==> Customer has many Tender

Customer customer = new CorporateCustomer(35); // ==> This will pass CustomerID = 35
string customerSiteName  = customer.CorporateSites[0].Name;  // ==> Customer has many Site

在我的网站中也实现了Get():

Site site = new CorporateSite();
List<Site> = site.Get(); // ==> This will return all sites

现在问题是我想要使用相同的Get()

执行以下操作
Customer customer = new CorporateCustomer(35);
List<Site>  = customer.CorporateSite.Get();  // ==> This will return all site belong to Customer (at this stage I don't know how to do this as yet)

正如你所看到的那样,因为它使用相同的Get()方法,所以不使用像这个GetByCustomer()那样区分它。

有没有办法以某种方式你在Get()我有一个“检查”哪个是相关的需要显示基于对象/类实例化或什么。

谢谢

2 个答案:

答案 0 :(得分:1)

如何customer.CorporateSites返回客户的所有网站?

答案 1 :(得分:1)

您应该可以使用可以注入到CorporateSite类(和其他类)中的策略来执行此操作。然后,CorporateSite类使用策略来实现Get方法。

在此示例中,我使用Func<IList<Site>>作为策略(since delegates are excellent anonymous interfaces),但如果您更愿意,可以使用接口或抽象类。

想象一下,您修改了CorporateSite类以将策略作为输入:

public class CorporateSite
{
    private readonly Func<IList<Site>> get;

    public CorporateSite(Func<IList<Site>> getStrategy)
    {
        this.get = getStrategy;
    }

    public IList<Site> Get()
    {
        return this.get();
    }
}

如果你有一个很好的默认实现,你可以添加一个使用默认策略的构造函数重载,但我将其留作读者的练习。

这里的要点是,CorporateSite类本身不实现Get方法,而是将该实现推迟到策略。

然后,Customer类可以将所需的策略注入它公开的CorporateSite实例中:

public class Customer
{
    private readonly CorporateSite site;

    public Customer()
    {
        this.site = new CorporateSite(this.GetSites);
    }

    public CorporateSite CorporateSite
    {
        get { return this.site; }
    }

    private IList<Site> GetSites()
    {
        // Put real implementation here
        return new List<Site>();
    }
}

需要公开CorporateSite的其他类可以在应用自己的Get逻辑时执行相同操作。

您可以使用相同的模式来实现需要使用Get方法的其他类。