Хорошая практика для двух виртуальных методов, которые делегируют работу друг другу - PullRequest
0 голосов
/ 06 июля 2018

Следующая ситуация: Интерфейс объявляет 2 метода, которые выполняют одно и то же действие с разными параметрами.

interface IX
{
  string DoTheThing(A a);
  string DoTheThing(B b);
}

Теперь объекты A могут быть преобразованы в B с некоторыми затратами и наоборот. Таким образом, мы могли бы хотеть использовать абстрактный класс вместо интерфейса, который бы выглядел примерно так:

abstract class X
{
  public virtual string DoTheThing(A a) { return DoTheThing(a.ConvertToB()); }
  public virtual string DoTheThing(B b) { return DoTheThing(b.ConvertToA()); }
}

Таким образом, подкласс должен реализовывать только 1 из методов, если требуется. Однако он также должен реализовать хотя бы один из них, в противном случае мы получаем бесконечную рекурсию. Теперь возникает вопрос, должен ли я сделать один из методов абстрактным и обеспечить реализацию? Проблема в том, что мне нужно выбрать один из методов, и он может быть неправильным для некоторые из подклассов и приводят к большему количеству конверсий.

Итак, второй вопрос о том, что мне не хватает лучшего решения по некоторым языковым функциям или лучше дизайнерские решения (или я обдумываю это)?

P.S Я работаю с C #, но ответ не должен ограничиваться C #.

...