Классы, реализующие интерфейсы, имеют некоторую дополнительную функцию. Тогда как с этим справиться? - PullRequest
0 голосов
/ 10 июля 2010

У меня есть три класса, которые использовали один общий интерфейс.Но в одном классе у меня есть еще одна функция (дополнительная функция ()), отличная от определенной интерфейсом функции.Предположим, что эта ссылка на тип интерфейса передается в качестве параметра в метод уровня обслуживания. Если мне нужно вызвать дополнительную функцию, что мне делать?как одна дополнительная функция ()). Дизайн в порядке? или мы должны попробовать абстрактный класс или еще.

Ответы [ 5 ]

0 голосов
/ 11 июля 2010

спасибо за ваши ответы.Но один из моих руководителей посмотрел на синтаксис уровня обслуживания, например var y = x, как SpecialClass; и сказал, что это не очень хороший подход к проектированию.Он предложил мне использовать Фабрику на уровне бизнес-менеджера, а затем делать этот тип кастинга.

0 голосов
/ 10 июля 2010

Так что на самом деле у вас есть два интерфейса, один из которых реализует другой.

public interface IMyInterfaceA
{
   void Method1();
   void Method2();
}

public interface IMyInterfaceB: IMyInterfaceA
{
   void ExtraMethod();
}

Тогда ваши методы уровня обслуживания должны принимать IMyInterfaceA или IMyInterfaceB в зависимости от того, требуют ли они ExtraMethod или нет.

Если у вас есть метод, который мог бы принимать IMyInterfaceA, но, возможно, сделал бы что-то «особенное», если IMyIntefaceB был доступен, вы могли бы использовать отражение (или просто оператор «как»), или, возможно, лучше просто предоставить 2 перегруженные версии методапоскольку компилятор должен разрешить вызов IMyInterfaceB, где это уместно.

0 голосов
/ 10 июля 2010

Если у вас есть код:

void Op(IMyInterface x)
{
  x.This();
  x.That();
}

Вы можете сделать:

void Op(IMyInterface x)
{
  x.This();
  x.That();

  var y = x as SpecialClass;
  if(y != null)
  {
    y.TheOther();
  }
}

Хотя IMO немного запутанна - если вы вставите некоторый код, мы, вероятно, сможем вам помочь.

0 голосов
/ 10 июля 2010

Чтобы свести на нет ответ Алекса, вы можете определить второй интерфейс IMyOtherInterface с помощью вашего дополнительного метода.Затем сделайте что-то вроде этого:

void Op(IMyInterface x, IMyOtherInterface y) {
  x.This();
  x.That();

  if(y != null) {
    y.TheOther();
  }
}

Когда вы вызываете метод, если ваш класс реализует оба интерфейса, вы можете передать его дважды.В противном случае только один раз.Нет причины, по которой ваша реализация должна знать, что это один и тот же класс, реализующий оба интерфейса.Если вы используете VB или 4.0 C #, вы можете пометить этот второй параметр как «необязательный».

Третий вариант - просто добавить дополнительный метод в исходный интерфейс, но назвать его более общим, например: «DoFinalization () ", и пусть ваши классы реализации просто имеют пустую реализацию, за исключением одного особого случая, когда вам это нужно.

0 голосов
/ 10 июля 2010

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

Заставьте сервисный уровень использовать этот дополнительный интерфейс при необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...