请帮助我如何跳过这些条件?
我正在使用工厂模式。
pizza = pizzaFctory.create ('xxx'); # e.g. these types are a,b,c,d
现在我调用一个函数
pizza->verifySomething ('yyy');
这是我的问题:
对于不同类型(a,b,c,d),参数'foo'是不同的。例如如果create()
的参数是'a',那么verifySomething
'fooa'的参数。同样,如果create()
的参数为'b',则参数verifySomething
'foob'。
我知道我可以放一个条件并验证它。
if (pizza->isTypeA)
{
pizza->verifySomething ('fooa');
}
如果条件允许,我想避免这种情况。请告诉我一些实现它的方法。
答案 0 :(得分:2)
public abstract Pizza
{
public abstract bool VerifySomething( object obj );
}
public class APizza : Pizza
{
public bool VerifySomething( object obj )
{
FooA foo = (FooA)obj;
...
}
}
public class BPizza : Pizza
{
public bool VerifySomething( object obj )
{
FooB foo = (FooB)obj;
...
}
}
如果所有类型的披萨都没有VerifySomething方法,那么您可能违反了Liskov替代原则(LSP)。可能有更好的方法来分离你的类,这将使这更明显。
答案 1 :(得分:0)
您可以将verifySomething
的参数作为创建的披萨的属性(或方法),沿着这些行(在C#中,但它应该是可以理解的)
public abstract class Pizza
{
public abstract string GetParameter();
public bool VerifySomething1()
{
//You can use GetParameter here directly
}
public bool VerifySomething2(string parameter)
{
//The parameter is passed from the caller
}
}
public class Capricciosa : Pizza
{
public override string GetParameter() {return "CapricciosaParameter";}
}
public class Vezuvio : Pizza
{
public override string GetParameter() {return "VezuvioParameter";}
}
Pizza pizza = PizzaFactory.Create("Vesuvio");
pizza.VerifySomething1(); //parameter is gotten inside the method
pizza.VerifySomething2(pizza.GetParameter()); //the parameter is explicitly passed