我有多个类对不同的命名方法有类似的实现:
class MyClassX
{
public int MyClassXIntMethod(){}
public string MyClassXStringMethod(){}
}
class MyClassY
{
public int MyClassYIntMethod(){}
public string MyClassYStringMethod(){}
}
类中的方法具有类似的实现,但由于方法的名称不同(由于第三方约束),我不能使用继承。
我正在寻找一种优雅的解决方案,而不是一遍又一遍地实现相同的功能。
答案 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)
真实世界的例子。
没有“软件模式”。 (我应用软件模式,非常有用,但是,我并没有对它们说话。)
#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);
}
干杯。