应用场所是这样的:
一个菜单点击后要根据不同的环境要弹出不同的窗体出来,我想用工厂方法来实现,可遇到的问题是,C#只允许单继承,而窗体的父类肯定是Form,设计模式里工厂方法的关键就是多态,要定义抽象类。可问题是窗体的父类肯定是Form,那我定义了抽象类又有什么用呢?
定义接口是可以实现多继承,可接口无法定义对象。
例如:// 定义了一个接口
public   interface   IShape   // 接口无法定义对象,下面这句话有错
IShape shape;设计模式和C#都是菜鸟。请各位帮个忙。

解决方案 »

  1.   

    public interface IShape
    {
     void ShowForm();
    }public class Factory
    {
     public  IShape GetForm(int type)//其实这里可以直接用Form类作为返回类型
    {
     //根据type创建你的对象实例
      return shape;
    }
    }
    //这里仅作为例子
    public class Shape1:IShape,Form
    {
     
     public void ShowForm()
    {
     this.show();
    }
    }
    //这里仅作为例子
    public class Shape2:IShape,Form
    {
     public void ShowForm()
    {
     this.show();
    }
    }
      

  2.   

    在.net、java这种单根继承的平台中,多重继承用interface将就着实现。
      

  3.   

    你打开你的Form的后台.cs代码,为其Form的类型定义加上使用你自己的那个IShape就可以了。
      

  4.   


    人家的要求是:在菜单的功能中使用工厂方法就是返回不同的Form(但同时又有自己的接口扩展)。也就是你用一句“完成需要的菜单功能”就忽略过去的那个东西才是人家需要搞明白的。
      

  5.   

    C# 中多继承使用接口
    通过接口创建对象
    看看petshop 
    interface IA
    {}
    public class A:IA
    {}  string CacheKey = DALFactory._path + ".A";
      object objType = DALFactory.GetInstance(CacheKey);
      (IA)objType;
    通过字符串弹出form可使用反射
      

  6.   

    定义一个工厂接口IFactory,然后每个窗口类对应创建一个工厂类,比如Form1有Form1Factory,工厂类实现接口IFactory。然后在菜单点击事件中用GetFactory()方法,根据环境获得对应的工厂类,返回值是IFactory接口,再用接口的方法创建窗口:IFactory f = GetFactory();
    f.CreateForm();
      

  7.   

    你先看看书,熟悉一下基本概念再说吧。  你的问题是 根据不同的环境 显示不同的窗体。再不同的窗体也是窗体,所以使用工厂模式根据反射创建不同的子类,返回的 可以是form 父类。  
      

  8.   

    对,,但你这里没有必要使用抽象工厂,你就使用一个带参数的简单工厂就足够了。
    public class Factory
    {
     public static IShape GetForm(Type type)//其实这里可以直接用Form类作为返回类型
    {
      object o=Activator.CreateInstance(type);//反射创建对象,你的对象需要有无参构造函数
     if(o is IShape)
       return o as IShape;
     return null;
    }可以这样调用:
    Factory.GetForm(typeof(Shape1));如果觉得这种方式不好,还可以继承改造