我有一个“框架”,如果我通过代码使用它,它就能完成它的工作。这很好,因为并不是所有运行该框架的系统都安装了图形化程序。
现在,我想为这个框架创建一个图形用户界面。由于框架的一个大的、自管理的组合最终正在运行,我不想创建一个并行的GUI层次结构,并重新实现GUI的所有自管理功能以及组织。实际上,我的想法是只为每个类创建一个扩展,例如,名为gui的扩展,它可以稍后包含在主窗口中。因此,我想概述如下:

在这个例子中,我不喜欢多重继承。如使用m2()的示例所示,它介绍了一些问题。这里的问题是:“哪个m(2)是由ConcreteGui执行的,更新的是AbstractGui执行的,还是来自ConcreteClass的AbstractClass更新的?”
我可以使用哪种方法或设计模式?
编辑:
让我们假设以下给定的框架(这是一个与语言无关的问题,Python仅用作示例)。
class AbstractClass:
def __init__(self):
self.a = 23
self.b = 42
def m1(self):
return self.a + self.b
def m2(self):
self.b += 1
return self.a * 2
class ConcreteClass1(AbstractClass):
def __init__(self):
super().__init__() # constructor of AbstractClass
self.c = 13
self.d = 7
def m3(self):
return self.a - self.d
def m4(self):
self.a += 1
return self.b / self.c现在,每个属性都将获得一个GUI-小部件作为用户友好的表示(显示当前值)以及界面(设置一个值)。为此,我不想重写所有方法来使用特定的小部件而不是属性。添加的小部件对所有已经实现的方法都应该是透明的。
发布于 2017-01-05 12:55:21

您不能同时从ConcreteClass和AbstractGUIClass派生,您可能必须将GUI实现保持分离并将它们注入ConcreteGuiClass中。
public class ConcreteClassGui1 : ConcreteClass1 {
private IGuiSpecificOperations _guiSpecificOperations;
public ConcreteClassGui1(IGuiSpecificOperations guiSpecificOperations){
_guiSpecificOperations = guiSpecificOperations;
SetSomeGuiProperties();
}
~ConcreteClassGui1(){
}
public override Method2()
{
// specific implementation
}
private void SetGuiProperties()
{
_guiSpecificOperations.PropertyGuiA = "Test";
_guiSpecificOperations.PropertyGuiB = 10;
}
}
public class ConcreteClassGui2 : ConcreteClass2 {
private IGuiSpecificOperations _guiSpecificOperations;
public ConcreteClassGui2(IGuiSpecificOperations guiSpecificOperations){
_guiSpecificOperations = guiSpecificOperations;
}
~ConcreteClassGui2(){
}
public override Method2()
{
// specific implementation
_guiSpecificOperations.PropertyGuiA = "Text";
_guiSpecificOperations.PropertyGuiB = 10;
}
}
public class GuiSpecificOperationImplementation : IGuiSpecificOperations {
public GuiSpecificOperationImplementation(){
}
~GuiSpecificOperationImplementation(){
}
public string PropertyGuiA{ get; set;}
public int PropertyGuiB {get; set;}
}
public interface IGuiSpecificOperations
{
public string PropertyGuiA{ get; set;}
public int PropertyGuiB {get; set;}
}还注意到,IGuiSpecificOperations的实现已经注入到ConcreteGuiClass中,而不是派生它们。
https://stackoverflow.com/questions/41469599
复制相似问题