接口与通用工厂

时间:2014-02-07 12:24:48

标签: c# generics interface

我正在尝试做这样的花哨的东西:

我有以下代码:

public interface IMyInterface
    {
      void Method1();
    }

  public interface IClassFactory
  {
      object GetObject();
  }

  public interface IGenericClassFactory<T> where T: IMyInterface
  {
       T GetObject();
  }

public class MyClass : IMyInterface
    {
        public void Method1()
        {
            Console.WriteLine("Medota 1");
        }

    }

    public class MyFactory : IClassFactory
    {
         public object GetObject()
        {
            return new MyClass();
        }
    }

    public class MyGenericFactory<T> : IGenericClassFactory<T> where T : IMyInterface, new()
    {
        public T GetObject()
        {
           // T t = new T();
            //return t;
            //var ctor = typeof(T).GetConstructor(new Type[0]);//1] { typeof(int) });
            //if (ctor != null)
            //{
            //    return (T)ctor.Invoke(new object[0]); // new object[1] { 5});
            //    //return Activator.CreateInstance<T>(); //to samo co wyzej tylko nie jest bezpieczne
            //}
            //throw new InvalidOperationException("T nie posiada domyślnego konstruktora");
           // return Activator.CreateInstance<T>(); //bez parametrów 
           // return (T)Activator.CreateInstance(typeof(T), 5, "EOG", new object()); // z parametrami
            return new T();

        }
    }




 static void Main(string[] args)
        {
            IClassFactory factory;
            factory = new MyFactory();

            IGenericClassFactory<IMyInterface> genFactory;
            genFactory = new MyGenericFactory<MyClass>(); //Do not compile!

            MyClass obj = genFactory.GetObject() as MyClass;

            obj.Method1();
            Console.ReadKey();
        }

我可以这样做:

 IGenericClassFactory<IMyInterface> genFactory;
            genFactory = new MyGenericFactory<MyClass>();

//所以我可以选择创建对象

但我认为这是毫无意义的,因为我希望拥有超过一个对象的Factory。 你可以帮帮我吗?

提前谢谢

1 个答案:

答案 0 :(得分:2)

您不应该使您的工厂类具有通用性,但方法GetObject应该是通用的:

public T GetObject<T>() where T: IMyInterface, new()

然后:

 static void Main(string[] args)
 {
      var factory = new MyFactory();
      var obj = factory.GetObject<MyClass>();

      obj.Method1();
      Console.ReadKey();
 }

总而言之,你应该摆脱你的通用代码,只需修改你的MyFactory类

public class MyFactory : IClassFactory
{
     public T GetObject<T>()
    {
        //TODO - get object of T type and return it
        return new T();
    }
}

顺便说一下 - 我不确定这个通用实现的目的是什么?从Factory模式的使用角度来看它是否有意义?