-1

Factory Design パターンの実装に問題があります。http://dotnet.dzone.com/articles/design-patterns-c-factoryを見てきました 。これは、しばらく前に見つけた最初の良い例だったので、私のデザインに非常によく似ています。Abstract Factory Design Pattern
を見てみました が、私のデザインは非常に異なっており、それが必要かどうかを判断するのに苦労しています。

今のところ、こんな感じです。CR5、インターフェイス、ファクトリ、CB_spec、El などを同じビジュアル スタジオ プロジェクトに配置することで、以前はよりシンプルでした。設計の議論と CR6 などを分離する必要性に応じて、物事を移動する必要がありました。今、私は何をすべきかわからないいくつかのコンパイルの問題を抱えています。下記参照。私の質問は、以下の 2 つのコンパイルの問題に関するものです。

私の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_Factory 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;
    }
.
.
.
}

ファクトリをインスタンス化し、適切な型を取得する別の Visual Studio プロジェクト (実際には複数) があります。これを 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)
            {
                …
            }
        }

.
.
.
}
4

2 に答える 2

1

私の推測では、さまざまなプロジェクトが異なるバージョンの .Net ランタイムまたはプラットフォーム プロファイルを参照していると思います。私の疑いは、あなたのCR5プロジェクトがチェックするプロジェクトです。ファクトリは、コンシューマーのターゲット フレームワークが使用できないオブジェクトを返しています。(つまり、CR5 は .Net 4 であり、Factory/Consumer は .Net 3.5/2 または ClientProfile です。最後の 1 つは機能する可能性がありますが、さまざまなプロジェクト タイプを実際に台無しにすることはありません。)

于 2012-11-15T21:32:15.773 に答える
0

問題は、インターフェイスパラメータとCR5プロジェクトの両方で同じクラスへの参照があることでした。循環しているため、奇妙なコンパイルエラーが発生していました。これは、工場でCR6クラスを使用する準備をするために物事を移動したときに発生しました。

于 2012-11-30T18:07:13.023 に答える