我了解对象的概念,作为Java程序员,我觉得OO范式在实践中自然而然地出现在我身上。
但是最近我发现自己在想:
等等,使用对象比使用静态类(具有适当的封装和OO做法)实际具有哪些实际好处?
我可以想到使用对象的两个好处(既重要又强大):
多态性:允许您在运行时动态灵活地交换功能。还可以轻松为系统添加新功能“零件”和替代品。例如,如果有一个
Car
设计用于处理Engine
对象的类,并且您想向Car可以使用的系统中添加一个新的Engine,则可以创建一个新的Engine
子类并将该类的Car
对象简单地传递给该 对象,而不必改变一切Car
。您可以在运行时决定这样做。能够“传递功能”:您可以动态地在系统中传递对象。
但是与静态类相比,对象还有更多优势吗?
通常,当我向系统添加新的“部件”时,我会通过创建新类并从中实例化对象来实现。
但是最近,当我停下来想一想时,我意识到在很多我通常使用对象的地方,静态类将与对象相同。
例如,我正在为我的应用程序添加一个保存/加载文件机制。
对于一个对象,代码的调用行将如下所示: Thing thing = fileLoader.load(file);
对于静态类,它看起来像这样: Thing thing = FileLoader.load(file);
有什么不同?
通常,当普通的静态类的行为相同时,我只是想不出实例化对象的理由。但是在OO系统中,静态类很少见。所以我一定想念一些东西。
除了上面列出的两个对象以外,对象还有其他优点吗?请解释。
编辑:澄清。在交换功能或传递数据时,我确实发现对象非常有用。例如,我写了一个组成旋律的应用程序。MelodyGenerator
有几个不同的子类创建旋律,并且这些类的对象是可互换的(策略模式)。
旋律也是对象,因为传递它们很有用。和弦和音阶也是如此。
但是,系统的“静态”部分又将如何传递呢?例如-一种“保存文件”机制。为什么要在对象而不是静态类中实现它?
FileLoader
为从套接字读取的内容时会发生什么?还是模拟测试?或者打开一个zip文件?
System.Math
.NET中的示例说明了作为静态类更有意义的事情:您无需交换或模拟它,并且从逻辑上讲,任何操作都不能成为实例的一部分。我真的不认为您的“节省”示例符合要求。
Thing
?