【问题标题】:Object-Oriented Design: Which is better practice?面向对象设计:哪个更好?
【发布时间】:2013-02-02 08:40:13
【问题描述】:

我对创建对象的不同方式感到困惑,我在 java 文档和其他编程书籍中看到过。例如

假设有一个base class 和一个derived class

1- 我有一个Base 类型的变量,它引用Derived 类型的对象

List<String> list = new ArrayList<String>();

2- 我有一个Derived 类型的变量,它引用Derived 类型的对象

ArrayList<String> arrList = new ArrayList<String>();

我的问题是在选择 1 和 2 时我应该怎么想?是不是在一般 Base-Derived 场景中利用Polymorphism

在我不知道的 1 和 2 之间进行选择时,是否有 better practice,或者它只是 personal decision

编辑:

对不起,List 是一个接口。 另一个问题:如果我使用类型参数,我的决定会改变吗?

ArrayList<T> list = new ArrayList<T>();

更新答案:这实际上称为"Programming to the interface"。感谢代码大师。在这个问题的答案之一中用非常简单的术语解释了我正在寻找的内容 - What does it mean to "program to an interface"?

【问题讨论】:

  • 通常首选选项 1(忽略抽象基类和接口之间的区别)。在 OOP 中,我们称之为“对接口编程”。
  • 很抱歉。请查看另一个问题,已编辑。
  • 我仍然建议您将list 声明为List&lt;T&gt; 而不是ArrayList&lt;T&gt;。更改为类型参数不会显着改变您原来的问题。

标签: java oop class interface


【解决方案1】:
  1. List 不是基类,它是interface,因此应该尽可能使用。

    使用类实现的接口允许您使用实现该接口的所有类,而不仅仅是特定类。

  2. String 是一个具体的类,所以直接使用会更清晰。

    然而,有时即使String 实现了CharSequence 接口,也没有必要使用CharSequence,因为它只会造成混淆。但是,看看StringBuilder,它几乎只使用CharSequence

总之——没有更好只有合适

【讨论】:

  • 所以 1 更可取,但什么时候适合用例 2?请参阅我的另一个问题,已编辑。
  • @Prince - 当CharSequence 只会复杂化时,使用String 是合适的。
  • 我不明白你对2 的解释。什么时候会混乱?我什么时候应该只使用 ArrayList 类?
  • 谢谢。知道了。实际上在这里找到了一个很好的解释 - http://stackoverflow.com/questions/383947/what-does-it-mean-to-program-to-an-interface
【解决方案2】:

选择基本类型允许您在将来的某个时间点在使用 ArrayList 和 LinkedList 之间进行更改,而无需更改其余代码。这为您以后重构提供了更大的灵活性。同样,出于同样的原因,您的公共方法应该返回 List 而不是特定类型的 List 实现 - 这样您就可以更改内部实现以优化性能,而不会违反与调用者的约定。

【讨论】:

    【解决方案3】:

    如果 List 是一个类(只是为了回答您的问题而假设 - “我们应该使用父类的对象表示子类还是使用派生类类型的对象(actula 类)?”

    1)你是对的,它只是为了多态性。

    2) 主要用于在不同的类方法中传递对象。其他类的方法可能正在接受父类的输入。你必须在那些地方使用铸件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多