Я думаю, вы упустили назначение интерфейса. Если вы используете интерфейсы, не рекомендуется создавать классы с общедоступными методами, которые не являются частью интерфейса.
Итак, если ваша фабрика производит IAnimal. Вы не должны предполагать, что получаете класс Dog, реализующий метод WagTail, или класс Cat, который реализует LandsOnFeet. Вам нужно определить 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, и я предпочитаю, но может быть более сложным, чем необходимо, в зависимости от ваших потребностей.
Б. Конкретные методы для каждого подкласса
Вы также можете создать фабрику с функциями, которые создают собаку или кошку типа IAnimal.
public class AnimalFactory
{
public IAnimal GetDog()
{
return (IAnimal) new Dog();
}
public IAnimal GetCat()
{
return (IAnimal) new Cat();
}
}
Теперь, как было рекомендовано выше, вы можете безопасно выполнять трансляцию в IDog или ICat.
Не думаю, что есть один автор, который конкретно ответит на ваш вопрос. Однако чтение об инверсии управления и внедрении зависимостей, скорее всего, даст вам нужный уровень информации.
person
Spevy
schedule
31.03.2015