2017-01-04 5 views
0

У меня есть «фреймворк», который выполняет свою работу, если я использую его с помощью кода. Это хорошо, потому что не все системы, на которых будет работать инфраструктура, будут установлены графические элементы.Расширение рамки без GUI с помощью GUI

Теперь я хочу создать графический интерфейс для этой структуры. Поскольку большой, самоуправляемый составной части фреймворка, наконец, запущен, я не хочу создавать параллельную иерархию графического интерфейса и переопределять все элементы управления для графического интерфейса пользователя, а также организовывать. В самом деле, моя идея состоит в том, чтобы создать только расширение для каждого класса, e. г. gui, которые могут быть включены в основное окно позже. Поэтому, я бы эскиз его следующим образом:

enter image description here

На этой иллюстрации я не люблю множественное наследование. В качестве примера с m2() показано, что он вводит некоторые проблемы. Здесь речь идет о следующем: «Какой номер m(2) выполнен ConcreteGui, обновленный от AbstractGui или устаревший от AbstractClass, который пришел с ConcreteClass

Какой подход или шаблон дизайна я могу использовать?

EDIT:

Давайте предположим следующую заданную структуру (это зависит от языка и проблема 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-виджет как удобное представление (с указанием текущего значения), а также интерфейс (установка значения). Для этого я не хочу переписывать все методы, чтобы использовать конкретный виджет вместо атрибута. Добавленные виджеты должны быть прозрачными для всех уже реализованных методов.

+0

Является ли 'm2()' в 'AbstractGui' чем-то иным, чем 'AbstractClass'? если вы только расширяете «AbstractGui» на «#gui», то почему бы не реализовать это как интерфейс на обоих конкретныхGui (возможно, с инъекцией зависимостей)? – Jegan

+0

Да, 'm2()' 'AbstractGui' отличается от' AbstractClass'. Также возможно (или даже более вероятно), что 'm2()' переопределяется в 'ConcreteClass' вместо' AbstractGui'. Тогда '# gui' может быть интерфейсом, который реализуется' AbstractGui' и 'ConcreteGui', но как атрибуты' a' и 'b'' ConcreteGui' становятся свойствами? – Chickenmarkus

+0

Почему бы не удалить «AbstractGui» и заменить «IGui» или аналогичный, который содержит «+ a и + b свойства виджета и #gui» и реализовать их в каждом классе ConcreteGui, а также вы сможете переопределить + m2() от AbstractClass. – Jegan

ответ

0

Proposed Design

Вы не можете получить как из 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, а не для их получения.

+0

Прошу прощения, но я не понимаю. Я должен переопределить все методы, используя 'PropertyX', чтобы использовать' _guiSpecificOperations.PropertyGuiX', а? Я добавил пример на мой вопрос, который, как мы надеемся, начертает мою озабоченность более четко. – Chickenmarkus

Смежные вопросы