2016-01-24 5 views
0

Я хочу внедрить шаблон проектирования завода с общим типом возврата. Я создал этот пример, но я не могу заставить его работать. Как мой завод может вернуть тип общего типа и как его использовать в основном классе. Вот мой код:Factory Design Pattern Generic return Тип

namespace ConsoleApplication1 
{ 
    using System; 
    using System.Collections.Generic; 
    class MainApp 
    { 
     static void Main() 
     { 
      Factory fac = new Factory(); 
      IPeople<T> pep = fac.GetPeople(PeopleType.RURAL); 
      Console.WriteLine(pep.GetList()); 
     } 
    } 

    public interface IPeople<T> 
    { 
     List<T> GetList(); 
    } 

    public class Villagers : IPeople<DomainReturn1> 
    { 
     public List<DomainReturn1> GetList() 
     { 
      return new List<DomainReturn1>(); 
     } 
    } 

    public class CityPeople : IPeople<DomainReturn2> 
    { 
     public List<DomainReturn2> GetList() 
     { 
      return new List<DomainReturn2>(); 
     } 
    } 

    public enum PeopleType 
    { 
     RURAL, 
     URBAN 
    } 

    /// <summary> 
    /// Implementation of Factory - Used to create objects 
    /// </summary> 
    public class Factory 
    { 
     public IPeople<T> GetPeople(PeopleType type) 
     { 
      switch (type) 
      { 
       case PeopleType.RURAL: 
        return (IPeople<DomainReturn1>)new Villagers(); 
       case PeopleType.URBAN: 
        return (IPeople<DomainReturn2>)new CityPeople(); 
       default: 
        throw new Exception(); 
      } 
     } 
    } 

    public class DomainReturn1 
    { 
     public int Prop1 { get; set; } 

    } 

    public class DomainReturn2 
    { 
     public int Prop2 { get; set; } 
    } 
} 
+0

DomainReturn1 и DomainReturn2 имеют базовый класс? –

+0

зачем вам это нужно? не могли бы вы быть более явными? нет необходимости в генериках для вашего дела здесь –

ответ

2

Вы не должны пройти Enum на заводе-изготовителе, параметр T типа может быть использован, чтобы выбрать подходящий продукт, как это:

public class Factory 
{ 
    public IPeople<T> GetPeople<T>() 
    { 
     if(typeof(T) == typeof(DomainReturn1)) 
      return (IPeople<T>)new Villagers(); 

     if(typeof(T) == typeof(DomainReturn2)) 
      return (IPeople<T>)new CityPeople(); 

     throw new Exception(); 
    } 
} 

И вы можете используйте его следующим образом:

Factory factory = new Factory(); 

var product1 = factory.GetPeople<DomainReturn1>(); 

var product2 = factory.GetPeople<DomainReturn2>();