使用java抽象类

时间:2012-06-06 16:29:57

标签: java class abstract

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

  1. 让超类创建所有头部组件并打开组件到子类,子类将访问组件的setText方法来更新文本吗?
    1. 在超类中有抽象方法来创建组件,子类将实现这些方法来创建组件。
    2. 希望它有意义......

8 个答案:

答案 0 :(得分:3)

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

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

// elsewhere ....

UIScreen mainScreen = new UIScreen("Main Screen");

答案 1 :(得分:0)

使用通用头方法创建抽象类,并为要实现的所有子类定义一个最佳的方法。

答案 2 :(得分:0)

取决于您是否希望超类能够被实例化。这就像拥有Animal超类和DogCat子类。您是否希望人们能够创建通用的Animal

如果是这样,那应该是正常的课程。如果没有,则应声明abstract

所以最终的问题是:是否存在默认行为?如果没有,那就把它抽象化。

答案 3 :(得分:0)

第二种选择更可行。

请记住:Single Responsibility Principle

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

答案 4 :(得分:0)

当行为保持变化时......将其封装在abstact类或接口中。

最好有一个

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

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

您可以稍微更改选项

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分开,如果需要,您可以对页脚组件执行相同的操作。

答案 7 :(得分:0)

我的问题是子类是否有任何有用的功能?如果没有,为什么你不只是拥有一个具体的类并传递一些数据容器来填充字段?

如果没有行为差异,只需将数据和/或协作者传递给构造函数或通过属性设置器,就可以获得更好的效果。