Как вернуть объект, который реализует интерфейс из метода - PullRequest
2 голосов
/ 12 ноября 2009

Я пытаюсь изучить интерфейсы и хочу попробовать следующее:

Допустим, у меня есть интерфейс с именем ICustomer, который определяет основные свойства (UserID, UserName и т. Д.). Теперь у меня есть несколько конкретных классов, таких как ProductA_User, ProductB_User, ProductC_User. Каждый из них обладает различными свойствами, но все они используют ICustomer, поскольку все они являются клиентами.

Я хочу вызвать общий метод в фабричном классе с именем MemberFactory и сообщить его новому пользователю, а я просто задаю ему параметр перечисления, значение которого я хочу. Поскольку каждый конкретный класс отличается, но реализует ICustomer, я должен иметь возможность вернуть экземпляр, который реализует ICustomer. Однако я не совсем уверен, как это сделать в фабричном классе, так как мой тип возвращаемого значения - ICustomer.

Ответы [ 3 ]

7 голосов
/ 12 ноября 2009

Все, что вам нужно сделать, это создать свой объект так:

class ProductA_User : ICustomer
{
    //... implement ICustomer
}
class ProductB_User : ICustomer
{
    //... implement ICustomer
}
class ProductC_User : ICustomer
{
    //... implement ICustomer
}

class MemberFactory 
{
     ICustomer Create(ProductTypeEnum productType)
     {
         switch(productType)
         {
             case ProductTypeEnum.ProductA: return new ProductA_User();
             case ProductTypeEnum.ProductB: return new ProductB_User();
             case ProductTypeEnum.ProductC: return new ProductC_User();
             default: return null;
         }
     }
}
1 голос
/ 12 ноября 2009

Когда вы вызываете метод, все, что вам нужно сделать, это вернуть объект как обычно. Он сопоставляет его с интерфейсом, в который он входит.

ICustomer obj = MemberFactory.ReturnObjectWhichImplementsICustomer();
0 голосов
/ 12 ноября 2009

Заводской метод будет включать в себя код, который выполняет что-то вроде этого:

switch (customerType)
{
case CustomerType.A:
   return new ProductA_User();
case CustomerType.B:
   return new ProductB_User();
case CustomerType.C:
   return new ProductC_User();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...