gpt4 book ai didi

java - GUI 开发过程中 Java 多重继承的替代方案

转载 作者:行者123 更新时间:2023-12-02 13:24:17 25 4
gpt4 key购买 nike

我遇到了以下困境:Java 中没有多重继承,但我需要它,如何避免它?

以下是我开始思考这个问题的原因。

我需要一个具有多个特定属性和行为的文本框(处理焦点和模糊事件)。我毫不犹豫地开发了DecoratedTextBox:

public class DecoratedTextBox extends TextBox implements FocusHandler, BlurHandler {
public void onBlur(BlurEvent event) {
//cool feature implementation
}

public void onFocus(FocusEvent event) {
//another cool feature
}

//other cool features
}

我的 GUI 开始看起来不错,但我没有考虑到 PasswordTextBox。它还必须具有与 DecoratedTextBox 相同的属性和行为。但PasswordTextBox是从TextBox继承的,它实际上是另一个类层次结构分支。我立刻想起,如果 TextArea 也具有所有这些很酷的属性和行为等,那就太好了。

那么我的设计有什么问题导致了多重继承的想法呢?必须做什么才能满足上述要求?

一些说明

因此,我必须继承PasswordTextBox、TextArea 等才能利用它们的功能(这些类来自GWT 库)。但我不明白如何在这里编织构图。

更新

如果我对 Anders Johansen 的理解有误,请纠正我。

解决方案应如下所示:

public class DecoratedTextBox extend AbstractEventHandler {
private TextBox textBox;

//wrap TextBox methods
public String getText() {
return textBox.getText();
}
}

public class DecoratedPasswordTextBox extend AbstractEventHandler {
private PasswordTextBox passwordTextBox;

//wrap TextBox methods
//...
}

public class DecoratedTextArea extend AbstractEventHandler {
private TextAre textArea;

//wrap TextBox methods
//...
}

public abstract class AbstractEventHandler implements FocusHandler, BlurHandler {
public void onBlur(BlurEvent event) {
//default cool feature implementation
}

public void onFocus(FocusEvent event) {
//another default cool feature implementation
}
}

已更新

我尝试了 Anders Johansen 和 Hilbrand Bouwkamp 建议的变体,但在每种情况下我都遇到了一个问题,即我有一个添加小部件的方法(其签名无法更改),并且其中一个参数是 Widget 本身。因此,如果我不从 Widget 的子类中继承子类,我就会破坏很多类。

仍在继续思考解决方案。

最佳答案

我无法猜测您想要添加哪种很酷的功能,但是创建一个 TextBoxBaseDecorator 类怎么样,它看起来像:

public class TextBoxBaseDecorater implements FocusHandler, BlurHandler, HasAttachHandlers {
private final TextBoxBase textBoxBase;
private final ArrayList<HandlerRegistration> handlers = new ArrayList<HandlerRegistration>();

/*
* Pass the TextBoxBase extending widget to be decorated.
*/
public TextBoxBaseDecorater(TextBoxBase textBoxBase) {
this.textBoxBase = textBoxBase;
textBoxBase.addAttachHandler(this);
}

public void onBlur(BlurEvent event) {
//cool feature implementation
}

public void onFocus(FocusEvent event) {
//another cool feature
}

public void onAttachOrDetach(AttachEvent event) {
if (event.isAttached() {
handlers.add(textBoxBase.addBlurHandler(this));
handlers.add(textBoxBase.addFocusHandler(this));
} else {
for (HandlerRegistration rh: handlers) {
rh.removeHandler();
}
handlers.clear();
}
}

//other cool features

}

您可以创建子类,为特定小部件创建包装器,例如 TextBox、PasswordTextBox 和 TextArea。

关于java - GUI 开发过程中 Java 多重继承的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13306201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com