首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过GUI扩展非GUI框架

通过GUI扩展非GUI框架
EN

Stack Overflow用户
提问于 2017-01-04 17:13:15
回答 1查看 44关注 0票数 0

我有一个“框架”,如果我通过代码使用它,它就能完成它的工作。这很好,因为并不是所有运行该框架的系统都安装了图形化程序。

现在,我想为这个框架创建一个图形用户界面。由于框架的一个大的、自管理的组合最终正在运行,我不想创建一个并行的GUI层次结构,并重新实现GUI的所有自管理功能以及组织。实际上,我的想法是只为每个类创建一个扩展,例如,名为gui的扩展,它可以稍后包含在主窗口中。因此,我想概述如下:

在这个例子中,我不喜欢多重继承。如使用m2()的示例所示,它介绍了一些问题。这里的问题是:“哪个m(2)是由ConcreteGui执行的,更新的是AbstractGui执行的,还是来自ConcreteClassAbstractClass更新的?”

我可以使用哪种方法或设计模式?

编辑:

让我们假设以下给定的框架(这是一个与语言无关的问题,Python仅用作示例)。

代码语言:javascript
复制
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-小部件作为用户友好的表示(显示当前值)以及界面(设置一个值)。为此,我不想重写所有方法来使用特定的小部件而不是属性。添加的小部件对所有已经实现的方法都应该是透明的。

EN

回答 1

Stack Overflow用户

发布于 2017-01-05 12:55:21

您不能同时从ConcreteClass和AbstractGUIClass派生,您可能必须将GUI实现保持分离并将它们注入ConcreteGuiClass中。

代码语言:javascript
复制
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中,而不是派生它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41469599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档