2

在我的 UI 项目中,我有几个屏幕共享相同的标题样式,只有文本特定于屏幕。什么是实现这一点的好方法?

  1. 让超类创建所有的头部组件,并把组件开放给子类,子类会访问组件的setText方法来更新文本吗?

或者

  1. 超类中有抽象方法来创建组件,子类将实现这些方法来创建组件。

希望有意义..

4

8 回答 8

3

你真的需要一个抽象类吗?

public class UIScreen {
     public UIScreen(String headerText) {
         //set everything up here w/ the right text
     }
}

// elsewhere ....

UIScreen mainScreen = new UIScreen("Main Screen");
于 2012-06-06T16:35:37.880 回答
0

第二种选择更可行。

记住:单一职责原则

这两个选项都有效,但第二个选项可以减少代码中的耦合。

于 2012-06-06T16:36:27.957 回答
0

当行为不断变化时......将其封装在抽象类或接口中。

最好有一个

 Abstract class, with the non-abstract method to create the Header, 
and an Abstract method to create the text

..在子类中,您可以通过实现抽象方法来创建您选择的文本。

于 2012-06-06T16:36:35.837 回答
0

“在超类中有抽象方法来创建组件,子类将实现这些方法来创建组件。”

在我看来,这个解决方案更容易维护。

于 2012-06-06T16:37:02.377 回答
0

您可以稍微更改选项 1

public abstract class SuperUI {

   private HeaderComponenet headerComponent;//have getter setter

}

public class BaseUI extends SuperUI{
    private void changeHeaderComponent(){
       headerComponent.setText("Changed");
    }
}

public class HeaderComponent extends JComponent{
   public HeaderComponent(){
      //create the default header here
   }
}

在这种情况下,如果必须更改默认页眉组件,则不必更改 SuperUI,因为您已将页眉与 SuperUI 分开,如果需要,您可以对页脚组件执行相同操作。

于 2012-06-06T16:38:41.337 回答
0

使用通用头方法创建抽象类,并为所有子类定义一种方法来实现最好。

于 2012-06-06T16:33:02.200 回答
0

取决于您是否希望超类能够被实例化。这就像拥有一个Animal超类DogCat子类。您是否希望人们能够创建泛型Animal

如果是这样,它应该是一个正常的类。如果不是,则应声明abstract

所以最终的问题是:是否存在默认行为?如果不是,则将其抽象化。

于 2012-06-06T16:33:58.807 回答
0

我的问题是子类有什么有用的功能吗?如果没有,您为什么不只拥有一个具体的类并将其传递给某种数据容器来填充字段?

如果没有行为差异,那么将数据和/或协作者传递给构造函数或通过属性设置器会更好。

于 2012-06-06T17:14:29.940 回答