2009-09-10 3 views
1

У меня 3 абстрактных класса (Заказчик, Тендер, Сайт). Для Клиента унаследовал класс, такой как CorporateCustomer. Для тендеров есть классы 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() у меня была «проверка», которая имеет значение, должна отображаться на основе объекта/класса, является экземпляром или чем-то.

Спасибо

ответ

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, а скорее отменяет эту реализацию в Стратегии.

Класс Клиент может затем придать нужную стратегию в 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.

+0

Спасибо за это. Теперь я знаю, как использовать шаблон стратегии, хотя я все еще разбираюсь, чтобы понять это. Это GetStrategy, о чем идет речь? – dcpartners

+0

Переменная getStrategy - это Стратегия, которая реализует функциональность «Get» - отсюда и название. –

+0

Метод Get(), который находится в CorporateSite, относится к коллекции всех сайтов?Где тот, который относится к Get() (такой customer.CorporateSite.Get()) для обработки коллекций сайтов для конкретного клиента?!?!? – dcpartners

1

как насчет customer.CorporateSites вернуть все сайты клиента?

Смежные вопросы