C# visualstudio中工厂设计模式的问题

C# visualstudio中工厂设计模式的问题,c#,visual-studio-2010,factory-pattern,C#,Visual Studio 2010,Factory Pattern,我在实现工厂设计模式时遇到了问题。我看过 , 这与我的设计非常相似,因为这是我不久前发现的第一个好例子。 我看了一眼 , 但是我的设计非常不同,我很难决定是否需要它 现在,这就是它的样子。它过去更简单,我的CR5、界面、工厂、CB_规范、El等都在同一个VisualStudio项目中。我必须按照设计讨论和CR6等需要分开的方式进行调整。现在我遇到了一些编译问题,我不知道该怎么办。见下文**。我的问题是关于以下两个汇编问题 我的iCR Visual Studio项目: public int

我在实现工厂设计模式时遇到了问题。我看过 , 这与我的设计非常相似,因为这是我不久前发现的第一个好例子。
我看了一眼 , 但是我的设计非常不同,我很难决定是否需要它

现在,这就是它的样子。它过去更简单,我的CR5、界面、工厂、CB_规范、El等都在同一个VisualStudio项目中。我必须按照设计讨论和CR6等需要分开的方式进行调整。现在我遇到了一些编译问题,我不知道该怎么办。见下文**。我的问题是关于以下两个汇编问题

我的iCR Visual Studio项目:

    public interface iCR
    {
        int CB_IO_Init(int slaveIndex);
        int WritePortReady();
        int WritePortBusy();
        void initCRData(byte[] writeBuffer, byte[] statusBuffer, int SlaveIndex, USB_Comm.CB cb, int cr_Type);
        int ProcessTWriting(ref Byte[] writeDat, ref Byte[] statusDat, ref Byte[] dataDumpWriteCheck);
        void Failure(String message);
        void Success(String message);

    }
我的CR_工厂Visual Studio项目

namespace CR_Factory
{

public class Cr
{

}  

public class CRFactory
{
    public enum CRType
    {
        CR0,
        CR1,
        CR3,
        CR4,
        CR5,
        CR6
    }

    public CRFactory()
    {
    }

    public iCR GetCR(CRType type) 
    {
        iCR cr = null;
        switch (type)
        {
            case CRType.CR5:
                cr = new CR5(); //**compile error..Cannot implicitly convert type ‘CR5’ to iCR’. An explicit conversion exists (are you missing a cast?)
                break;
            case CRType.CR6:
                //not done yet
                break;
            default:
                throw new ArgumentException(string.Format("A CR of type {0} cannot be found", Enum.GetName(typeof(CRType), type)));
        }
        return cr;
    }

    public CRType DetermineCR_Type(int type)
    {
        switch (type)
        {
            case 0:
                return CRType.CR0;
            //break;
            case 1:
                return CRType.CR1;
            case 3:
                return CRType.CR3;
            case 4:
                return CRType.CR4;
            case 5:
                return CRType.CR5;
            case 6:
                return CRType.CR6;
            default:
                throw new ArgumentException(string.Format("A type of type {0} cannot be found", type));

        }
    }

    }
}
我的CR5 Visual Studio项目中有很多类,但现在我只是向您展示工厂中提到的部分。稍后我将创建一个CR6 VS项目,等等:

public class CR5 : iCR
{        


    CB_703 cb_specific = null;

    //constructor
    public CR5()
    {
        cb_specific = new CB_703(SlaveIndex);
    }


    public int CB_IO_Init(int SlaveIndex)
    {
        int result = -534;
        result = cb_specific.IO_Init(SlaveIndex);
        return result;
    }
.
.
.
}
我有另一个VisualStudio项目(实际上有几个),它实例化工厂并获得适当的类型。我们称之为El:

namespace CrWr
{

public partial class PControl : UserControl
{
    //setup 

    //constructor
    public PControl()
    {

    }

    /// <summary>
    /// Get the P Control for chosen dll
    /// </summary>
    public Control GetPControl(USB_Comm.CB cbInstance, string dllSelected, THandlerApplication.Temp.TEMP[] temp, string dll, SC.SC.S_C c0)
    {
        cb = cbInstance;
        createControls();
        itsDll = dll;
        tArr = temp;
        cert = c0;

        CR_Factory.CRFactory factory = new CR_Factory.CRFactory();
        CRFactory.CRType type = factory.DetermineCR_Type(cr_Type);
        try
        {
            cr = factory.GetCR(type); //**compile error GetCR is not supported by the language
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.InnerException);
        }
        return this;
    }

private void OnP()
    {
        int result = -536;

        while (rL)
        {
            result = cr.CB_IO_Init(SlaveIndex); 
            if (result == 0)
            {
                …
            }
        }

.
.
.
}
名称空间CrWr
{
公共部分类PControl:UserControl
{
//设置
//建造师
公共控制
{
}
/// 
///获取所选dll的P控件
/// 
公共控件GetPControl(USB_Comm.CB cbInstance,已选择字符串dll,THandlerApplication.Temp.Temp[]Temp,字符串dll,SC.SC.S_C c0)
{
cb=cb实例;
createControls();
itsDll=dll;
tArr=温度;
证书=c0;
CR_Factory.CRFactory=新的CR_Factory.CRFactory();
CRFactory.CRType type=工厂。确定CRU类型(CRU类型);
尝试
{
cr=factory.GetCR(类型);//**编译错误该语言不支持GetCR
}
捕获(例外情况除外)
{
Console.WriteLine(例如InnerException);
}
归还这个;
}
私有无效OnP()
{
int结果=-536;
while(rL)
{
结果=cr.CB_IO_Init(SlaveIndex);
如果(结果==0)
{
…
}
}
.
.
.
}

我的猜测是,您的各个项目引用了不同版本的.Net运行时或平台配置文件。我怀疑您的CR5项目是要检查的项目。工厂正在返回消费者的目标框架无法使用的对象。(也就是说,CR5是.Net 4,而工厂/消费者是.Net 3.5/2或ClientProfile——尽管最后一个可能会起作用,但我并没有真正弄乱不同的项目类型。)

问题是,我在接口参数和CR5项目中都引用了同一个类。因为它是循环的,所以导致了奇怪的编译错误。这是在我移动东西准备工厂使用CR6类时发生的。

请将代码减少到理解CR6类所需的部分还有你的问题。尤其是使用语句的
和注释只会把列表弄得乱七八糟。如果你一开始不让代码可读,可能没有人会花时间阅读你的代码。那么……这里的问题是什么?哦,而且它可能更适合于任何问题,正如前几段所述,我现在我遇到了一些编译问题,我不知道该怎么办这是因为我把我的项目分成了更多的VS项目,为我的CR6实现做准备。有人对我看到的错误有什么建议吗?请看**。我去掉了using语句。我不确定问题是否出在工厂实现上,所以我展示了这么多代码。谢谢你的建议,Steve Py。我知道CR5是一个比我的El和其他VS项目更老的版本。到目前为止,它还不是一个问题(在我分拆成不同的VS项目以便在工厂中准备CR6之前),但当它以这种方式分拆时,可能不起作用。我会尝试一下。