Ramana Bellary Ответов: 4

Лучший способ разработать мои классы для требования в C#


Привет,
Может ли кто-нибудь помочь с наилучшим способом проектирования классов для приведенного ниже требования. Я не хочу реализовывать один и тот же метод несколько раз. Может ли кто-нибудь сказать мне даже, какой дизайн скороговорки подходит ему лучше.

Тигр: Ходить(), Бегать(), Плавать()
Лошадь: Бегать(), Плавать()
Черепаха: Ходьба(),Плавание()
Рыбы: Поплавайте()

Спасибо,
Рамана

Что я уже пробовал:

Я и сам не мог найти лучшего способа.

F-ES Sitecore

Все ли ваши классы имеют одинаковую реализацию? Разве рыба плавает так же, как лошадь?

4 Ответов

Рейтинг:
2

Dirk Bahle

Вы должны использовать наследование классов (абстрактные классы, виртуальные классы, как это предлагается в решении 1) и Фабричный шаблон, чтобы скрыть детали реализации за интерфейсами - вот пример без интерфейсов: Заводской метод .NET Design Pattern в C# и VB - dofactory.com[^]

Как только у вас есть образец на месте с вашими животными - вы можете заставить каждый класс реализовать интерфейс и сделать видимым только этот интерфейс в возвращаемом типе фабрики.

Эта модель реализована в Библиотека проект позволяет установить классы животных на внутренние и сделать их детали невидимыми для внешнего мира (только интерфейсы и Заводской класс должны быть общедоступными, если вы в конечном итоге получите правильный дизайн).


Graeme_Grant

Возразил 1 голос за действительный ответ

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();
        }
    }

Рейтинг:
18

Ramana Bellary

открытый абстрактный класс существо
{
общедоступный виртуальный недействительными ходьбы()
{

}

публичный виртуальный void Run()
{

}

общедоступный виртуальный недействительными плавать()
{

}
}
общественный класс Тигр : существо
{

}
лошадь общественного класса : существо
{
общественного переопределить недействительными ходьбы()
{
выбросить новое исключение("может ходить");
}
}
рыба общественного класса : существо
{
общественного переопределить недействительными ходьбы()
{
выбросить новое исключение("может ходить");
}

public override void Run()
{
выбросить новое исключение("Can Run");
}
}
общественный класс Черепаха : существо
{
public override void Run()
{
выбросить новое исключение("Can Run");
}
}


Рейтинг:
0

Wastedtalent

Вы изучали абстрактные классы, виртуальные классы, наследственность?


Graeme_Grant

Возразил 1 голос за действительный ответ

Рейтинг:
0

girishmeena

Очевидно, что мы можем применить шаблон разработки стратегии для указанной проблемы. Вы можете иметь различные стратегии, такие как ходьба, бег, плавание и изменять их реализацию во время выполнения с помощью инъекции зависимостей конструктора.
Вы можете иметь абстрактный класс Animal, другой дочерний класс будет наследовать от класса animal. в абстрактном классе animal будет ссылка на интерфейс стратегии.

public abstract class Animal
  {
      IWalkBehaviour walkBehaviour;
      IRunBehaviour runBehaviour;
      ISwimBehaviour swimBehaviour;

      public Animal() { }

      public abstract void LiveLife();

      public void performWalk()
      {
          walkBehaviour.walk();
      }

      public void performRun()
      {
          runBehaviour.run();
      }

      public void performSwim()
      {
          swimBehaviour.swim();
      }

      public void SetWalkBehaviour(IWalkBehaviour walk)
      {
          walkBehaviour = walk;
      }

      public void SetSwimBehaviour(ISwimBehaviour swim)
      {
          swimBehaviour = swim;
      }

      public void SetRunBehaviour(IRunBehaviour run)
      {
          runBehaviour = run;
      }

  }

  public interface ISwimBehaviour
  {
      void swim();
  }

  public class Swim : ISwimBehaviour
  {
      public void swim()
      {
          Console.WriteLine("swim");
      }
  }

  public class NoSwim : ISwimBehaviour
  {
      public void swim()
      {
          Console.WriteLine("no swim");
      }
  }

  public interface IRunBehaviour
  {
      void run();
  }

  public class Run : IRunBehaviour
  {
      public void run()
      {
          Console.WriteLine("run");
      }
  }

  public class NoRun : IRunBehaviour
  {
      public void run()
      {
          Console.WriteLine("no run");
      }
  }

  public interface IWalkBehaviour
  {
      void walk();
  }

  public class Walk : IWalkBehaviour
  {
      public void walk()
      {
          Console.WriteLine("walk");
      }
  }

  public class NoWalk : IWalkBehaviour
  {
      public void walk()
      {
          Console.WriteLine("no walk");
      }
  }