Дизайн: классы с одинаковой реализацией, но разными именами методов - PullRequest
1 голос
/ 03 января 2011

У меня есть несколько классов, которые имеют похожую реализацию для разных именованных методов:

class MyClassX
{
   public int MyClassXIntMethod(){}
   public string MyClassXStringMethod(){}
}

class MyClassY
{
   public int MyClassYIntMethod(){}
   public string MyClassYStringMethod(){}
}

методы внутри классов имеют похожую реализацию, но поскольку имена методов различаются (из-за ограничений третьих сторон), я не могу использовать наследование.

Я ищу элегантное решение, которое было бы лучше, чем многократная реализация одной и той же функциональности.

Ответы [ 4 ]

8 голосов
/ 03 января 2011

Классический ответ IMHO - использовать шаблон adpater для каждой сторонней вызывающей стороны. Не применяйте вслепую, но сначала посмотрите, подходит ли он вам.

class MyClassXAdapter
{
   IMyInterface _myImpClass

   public int MyClassXIntMethod(){ return _myImpClass.IntMethod()}
   public string MyClassXStringMethod(){ return _myImpClass.StringMethod() }
}

class MyClassYAdapter
{
   IMyInterface _myImpClass

   public int MyClassYIntMethod(){ return _myImpClass.IntMethod()}
   public string MyClassYStringMethod(){ _myImpClass.StringMethod() }
}

class MyClassImplementation :IMyInterface
{
   public int IntMethod(){}
   public string StringMethod(){}
}
4 голосов
/ 03 января 2011

А в чем проблема в использовании композиции?

class MyClassY
{
   private MyClassX myclx; 
   public int MyClassYIntMethod()
   {
     return myclx.MyClassXIntMethod();
   }
   public string MyClassYStringMethod(){...Similarly here...}
}

2 голосов
/ 03 января 2011

Почему бы просто не создать общий суперкласс и позволить каждому «MyClass_» вызывать эту общую функцию? Вы можете иметь другую сигнатуру программы и по-прежнему использовать одни и те же фрагменты кода. Без копирования и вставки того же кода снова.

class MyClassX extends MyClassGeneric
{
   public int MyClassXIntMethod(){}
   public string MyClassXStringMethod(){}
}

class MyClassY extends MyClassGeneric
{
   public int MyClassYIntMethod(){ return MyClassIntMethod();}
   public string MyClassYStringMethod(){return MyClassStringMethod();}
}

class MyClassGeneric
{
   protected int MyClassIntMethod(){ /*...... logic .....*/ return 0; }
   protected string MyClassStringMethod(){/*...... logic ....*/return "";}
}
0 голосов
/ 17 марта 2011

Пример из реального мира.

Без «программного паттерна». (Я применяю программные шаблоны, очень полезные, но я не привязан к ним)


collection.hpp

#define pointer void*

class Collection {
protected:
  VIRTUAL bool isEmpty();

  VIRTUAL void Clear();
}

class ArrayBasedCollection: public Collection {
protected:
  int internalInsertFirst(pointer Item);
  int internalInsertLast(pointer Item);

  pointer internalExtractFirst(int Index);
  pointer internalExtractLast(int Index);
}

class Stack: public ArrayBasedCollection {
public:
  OVERLOADED bool isEmpty();
  OVERLOADED void Clear();

  // calls protected "internalInsertFirt"
  void Push(pointer Item);
  // calls protected "internalExtractLast"
  pointer Pop(pointer Item);
}

class Queue: public ArrayBasedCollection {
public:
  OVERLOADED bool isEmpty();
  OVERLOADED void Clear();

  // calls protected "internalInsertFirt"
  void Push(pointer Item);
  // calls protected "internalExtractFirst"
  pointer Pop(pointer Item);
}

Приветствие.

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