我一直在阅读有关工厂/抽象工厂/简易工厂等的所有信息。我一直无法找到这个问题的答案。我理解工厂创建的类必须实现相同的接口,或者从相同的基类派生。但是如果不同的类不会以相同的公共接口结束会发生什么呢? I.E. SubClass1和SubClass2都派生自BaseClass。现在SubClass1 添加 PropertyA,SubClass2添加PropertyB。我是否正确认为这些课程不能由工厂创建,因为他们不会拥有相同的界面?或者,如果它们是作为BaseClass创建的,则它们不会公开它们的新属性。通用接口存在同样的问题。如果有人知道一个解决这个问题的作者,我会很感激参考。
非常感谢!
答案 0 :(得分:2)
我认为你已经错过了界面的目的。如果您正在使用接口,那么创建具有不属于接口的公共方法的类可能不是最佳做法。
因此,如果您的工厂生产IAnimal。您不应该假设您正在获得实现WagTail方法的Dog类或LandsOnFeet的Cat类。您需要定义IDog和ICat。 (可能继承自IAnimal)。
然后,您可以考虑工厂的行为方式。你有几个选择。
一个。泛型
然后,您可以创建一个Generic Factory接口IAnimalFactory,该接口在实现时返回IAnimal或特定类型。
public interface IAnimal
{
int Legs();
}
public interface IAnimalFactory<T> where T: IAnimal
{
IAnimal CreateAnimal();
T CreateSpecificAnimal();
}
public interface IDog:IAnimal
{
void WagTail();
}
public interface ICat : IAnimal
{
void LandOnFeet();
}
public class Dog:IDog
{
//Implementation Excluded
}
public class Cat : ICat
{
//Implementation Excluded
}
public class DogFactory:IAnimalFactory<IDog>
{
public IAnimal CreateAnimal()
{
return (IAnimal)CreateSpecificAnimal();
}
public IDog CreateSpecificAnimal()
{
return new Dog();
}
}
public class CatFactory : IAnimalFactory<ICat>
{
public IAnimal CreateAnimal()
{
return (IAnimal)CreateSpecificAnimal();
}
public ICat CreateSpecificAnimal()
{
return new Cat();
}
}
如果您决定实施IDomesticDog或IWildDog,Generic方法会为您提供一些未来的证明,这是我的偏好,但根据您的需要可能会更复杂。
B中。每个子类的具体方法
您还可以创建一个具有创建IAnimal类型的狗或猫的函数的工厂。
public class AnimalFactory
{
public IAnimal GetDog()
{
return (IAnimal) new Dog();
}
public IAnimal GetCat()
{
return (IAnimal) new Cat();
}
}
现在如上所述,您可以安全地投射到IDog或ICat。
我认为没有一位作者专门回答你的问题。但是,阅读控制和依赖注入反转可能会为您提供所需的正确信息。