设计:具有相同实现但方法名称不同的类

时间:2011-01-03 09:55:19

标签: oop

我有多个类对不同的命名方法有类似的实现:

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

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

类中的方法具有类似的实现,但由于方法的名称不同(由于第三方约束),我不能使用继承。

我正在寻找一种优雅的解决方案,而不是一遍又一遍地实现相同的功能。

4 个答案:

答案 0 :(得分:8)

经典答案恕我直言,每个第三方主叫方使用adpater pattern。 不要盲目地申请,但先看看它是否合适。

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

答案 1 :(得分:4)

使用构图时遇到的问题是什么?

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

答案 2 :(得分:2)

为什么不简单地创建一个公共超类,并让每个“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 "";}
}

答案 3 :(得分:0)

真实世界的例子。

没有“软件模式”。 (我应用软件模式,非常有用,但是,我并没有对它们说话。)


collections.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);
}

干杯。