0

工場を実装しようとしています。私が理解しているように、次の単純なコードはファクトリ(C#)です

private void methodName()
{
    var result = GetTypeByName("nameOfType")
}

private AbstractClassName GetTypeByName(string nameOfType)
{
    switch(nameOfType)
    {
       case "type1":
           return new inheritedFromAbstractClass();
       case "type2":
           return new alsoInheritedFromAbstractClass();
       default:
           throw new Exception();
    }
}

残念ながら、VS2005を使用した.NET 2.0プロジェクトで立ち往生しているため、「var」キーワードを使用できません。このようなことがどのように行われたか、または.NET 2.0でどのように行われるかについて、誰かにアドバイスをいただけますか。

したがって、より現実的な例:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Starting order");
        Console.WriteLine("Press 1 or 2");
        string s = Console.ReadLine();
        var order = GetOrderByIdFromFactory(s);
        order.ShippingAddress = "My House, England";
        Console.WriteLine(order.Ship());
        Console.ReadKey();
    }

    private static OrderShipment GetOrderByIdFromFactory(string s)
    {
        OrderShipment os = default(OrderShipment);
        switch (s)
        {
            case "1":
                return new FedExShipping();
                break;
            case"2":
                return  new UpsShipping();
                break;
            default:
                throw new NotImplementedException("Not implemented");
        }
    }
}

私の抽象基本クラス

public abstract class OrderShipment
{

    #region Properties
    public string ShippingAddress { get; set; }
    internal string Label { get; set; }
    private readonly TextWriter _text = new StringWriter();
    #endregion

    #region Public Methods

    internal string Ship ()
    {
        VerifyShippingData();
        GetShippingLabelFromCarrier();
        PrintLabel();
        return _text.ToString();
    }

    internal virtual void VerifyShippingData()
    {
        if (string.IsNullOrEmpty(ShippingAddress))
        {
            throw new ApplicationException("Invalid Address");
        }
    }

    internal abstract void GetShippingLabelFromCarrier();

    internal virtual void PrintLabel()
    {
        _text.Write(Label);
    }

    #endregion
}

そして私の2つの継承クラス

public class FedExShipping : OrderShipment
{
    internal override void GetShippingLabelFromCarrier()
    {
        //ToDo perform logic
        Label = "FedEx Label Details";
    }
}

public class UpsShipping : OrderShipment
{
    internal override void GetShippingLabelFromCarrier()
    {
        //ToDo logic
        Label = "Ups Label Details";
    }
}
4

4 に答える 4

3

なぜこのような何かをしないのですか?

AbstractClassName result = GetTypeByName("nameOfType")

varキーワードはイノベーションではありません。入力しない AbstractClassNameでください(この具体的な例では)。したがって、この具体的な質問のシナリオでは、2.0

于 2012-09-20T08:50:13.037 に答える
1

ファクトリの考え方は、抽象クラスのどのサブタイプがシステムからインスタンス化されるかを隠すことです。これにより、システム全体で使用するサブクラスを簡単に切り替えることができます (構成ファイルなどを使用)。

ただし、これを機能させるには、ファクトリが抽象クラスのインスタンスを構築するメソッドを公開する必要があります。私はおそらくあなたのコードを変更します:

private void methodName() 
{ 
    var result = GetTypeByName("nameOfType") 
} 

public AbstractClassName Create() 
{ 
    return GetTypeByName("nameOfType") 
} 
于 2012-09-20T08:57:41.167 に答える
0

使わない理由

AbstractClassName result = GetTypeByName("nameOfType"); 

?

于 2012-09-20T08:50:54.883 に答える
0
private void methodName()
{
    AbstractClassName result = GetTypeByName("nameOfType")
}
于 2012-09-20T08:52:19.647 に答える