Dirk Bahle
Вы должны использовать наследование классов (абстрактные классы, виртуальные классы, как это предлагается в решении 1) и Фабричный шаблон, чтобы скрыть детали реализации за интерфейсами - вот пример без интерфейсов: Заводской метод .NET Design Pattern в C# и VB - dofactory.com[^]
Как только у вас есть образец на месте с вашими животными - вы можете заставить каждый класс реализовать интерфейс и сделать видимым только этот интерфейс в возвращаемом типе фабрики.
Эта модель реализована в Библиотека проект позволяет установить классы животных на внутренние и сделать их детали невидимыми для внешнего мира (только интерфейсы и Заводской класс должны быть общедоступными, если вы в конечном итоге получите правильный дизайн).
Ramana Bellary
Ниже приведено то, с чем я пришел, дайте мне знать, если у вас есть какое-то лучшее решение.
открытый абстрактный класс существо
{
общедоступный виртуальный недействительными ходьбы()
{
}
публичный виртуальный void Run()
{
}
общедоступный виртуальный недействительными плавать()
{
}
}
общественный класс Тигр : существо
{
}
лошадь общественного класса : существо
{
общественного переопределить недействительными ходьбы()
{
выбросить новое исключение("может ходить");
}
}
рыба общественного класса : существо
{
общественного переопределить недействительными ходьбы()
{
выбросить новое исключение("может ходить");
}
public override void Run()
{
выбросить новое исключение("Can Run");
}
}
общественный класс Черепаха : существо
{
public override void Run()
{
выбросить новое исключение("Can Run");
}
}
Dirk Bahle
Это отличное начало, но вы все равно можете столкнуться с проблемами, как только вы смотрите на большую базу кода - то, что вы хотите сделать в этом случае, это запечатать ваши классы в библиотечный проект, а затем иметь только фабричный метод и определение интерфейса, которые будут видны внешнему миру. Скопируйте приведенный ниже код в библиотечный проект, обратитесь к библиотеке в стартовом проекте и используйте следующую строку для создания, например, лошади: ICreature hores = Factory.CreateHorse()
internal abstract class Creature
{
public virtual void Walk()
{
}
public virtual void Run()
{
}
public virtual void Swim()
{
}
}
public interface ICreature
{
void Walk();
void Run();
void Swim();
}
internal class Tiger : Creature, ICreature
{
}
internal class Horse : Creature, ICreature
{
public override void Walk()
{
throw new Exception("Can walk");
}
}
internal class Fish : Creature, ICreature
{
public override void Walk()
{
throw new Exception("Can walk");
}
public override void Run()
{
throw new Exception("Can Run");
}
}
internal class Tortoise : Creature, ICreature
{
public override void Run()
{
throw new Exception("Can Run");
}
}
public static class Factory
{
public static ICreature CreateTiger()
{
return new Tiger();
}
public static ICreature CreateHorse()
{
return new Horse();
}
public static ICreature CreateFish()
{
return new Fish();
}
public static ICreature CreateTortoise()
{
return new Tortoise();
}
}