1

我最近读到我应该在编程时使用通用类而不是特定类。我无法弄清楚为什么建议它。

示例:假设我们有一个继承自 JPanel 的类 MyPanel。MyPanel 有一个非继承方法,称为getLastChild。

代替:

MyPanel panel = new MyPanel():
Component last = panel.getLastChild();

建议这样做:

JPanel panel = new MyPanel();
Component last = ((MyPanel)panel).getLastChild();

我不明白为什么我应该选择第二个。

4

4 回答 4

4

你是对的,这个例子确实没有意义。

一般的经验法则是您应该使用仍然具有适当功能的最通用的类​​。这样,您就可以自由地更改正在使用的具体类,并让程序的其余部分继续工作。例如,考虑 JDK 的Collections.sort(List). 相同的方法调用可以与 a ArrayList、 aLinkedList或任何其他方法一起使用List- 它不关心该列表如何实现的细节,只关心它是一个列表这一事实。

但是,您的示例有所不同。如果你需要打电话MyPanel.getLastChild(),你肯定会关心有一个MyPanel- 你不能只使用任何其他JPanel的。JPanel由于您已经有了这种依赖关系,因此将变量声明为 a并将其向下转换为调用是没有意义的getLastChild()

于 2014-05-10T20:25:22.040 回答
0

一个很好的例子是:

List<Integer> list = new ArrayList<Integer>;

代替

ArrayList<Integer> list = new ArrayList<Integer>;

为什么?

tl;dr它为您提供更大的灵活性并免费概括您的代码。

解释

每当您想传递 alist时,您将使用List而不是ArrayList. 例如你有一个方法:

public void doSomething(List<Integer> list)

稍后,如果您意识到例如LinkedList是一个更好的选择,您可以轻松地更改您的实现。

于 2014-05-10T20:27:54.033 回答
-1

第二个带来了更大的灵活性。如果您将面板声明为 MyPanel 类型,则它只能是 MyPanel(或从 MyPanel 继承的类),而如果您将面板声明为 JPanel 类型,则它可以是通用 JPanel 或 JPanel 的任何子类(包括 MyPanel)。这使您的代码更具可移植性,并且在以后更易于编辑。您的组件现在可能只是一个 MyPanel,但如果以后发生变化怎么办?

于 2014-05-10T20:24:54.913 回答
-1

您现在可以开发与JPanels 一起使用的实用程序方法。让我们称之为foo(JPanel p)

现在您可以将它与任何JPanel包括MyPanel. 但为什么?您可以按如下方式定义该方法:foo(MyPanel p)并使用它,MyPanel直到您开发出它调用的第二个面板OtherPanel。您不能将其发送OtherPanel给仅foo()使用的操作MyPanel

然而,第一个(通用)版本foo()可以用于JPanel您、我或任何其他程序员扩展和开发的任何其他类。

我希望这个简单的例子足以理解泛化的需要。

于 2014-05-10T20:25:28.423 回答