java - 如何围绕面向对象设计进行思考

标签 java oop generics software-design

面向对象设计是一个非常简洁的概念,但我正在努力思考如何全面了解它的大部分方面。我认为良好的面向对象设计的关键是掌握如何看待它。我通常这样看待面向对象:

类是真实世界的实体或对象

实例字段是实体的属性,('has A')

方法就像 Action 、动词、实体的能力

接口(interface)就像您可以赋予对象的能力。它也可能是一种“是 A 或可以做”的关系,其实现不是一成不变的。超人是氪星,作为氪星人具有一系列特殊能力,如飞行、卡住呼吸等。超人的飞行不同于绿灯侠和悟空,尤其是 bat 侠,这就是为什么如果你将飞行作为界面可能是个好主意正在创造一个虚构的宇宙。

public class SuperMan extends Man implements Kryptonian{}

public interface Kryptonian extends Flight, FreezeBreath{
    public void fly();
    public void coolBreath();
}

当您将泛型添加到组合中时会出现问题吗?因为给定的类型参数以某种方式在类/接口(interface)和类型之间创建了契约。

public interface Flight<T>{
     public void fly(T t);
}

在这个例子中,Flight 加上了一个 T,T 可以是 super 英雄、鸟或任何可以飞的东西。但这真的是我想象的样子吗?因为这看起来与普通接口(interface)所做的一样?虽然,参数化接口(interface)仍然是接口(interface),但与类型 T 的耦合才是真正困扰我的地方。此外,当您对参数类型添加有界限制时,事情也会变得复杂。

public class Pidgey<T extends Bird> implements Flight<T>{}

您可以将 T 识别为哪个现实世界的具体对象?上面的例子是非常错误的,虽然使用类参数来限制 Flight 的类型可能是一个很好的设计,因为 Flight 仍然足够独立,其他类仍然可以不受任何限制地使用它。但是这个例子本身是错误的。 Pidgey 是一只会飞的鸟,但 T 会是什么呢?好吧,T 可以是任何东西,它可以是另一个对象或能力。问题是它的含义是什么,为什么要把 T 放在那里?这样做的真实例子有哪些?

当你谈论集合时很容易理解,因为集合就像容器。您可以创建各种各样的容器来容纳不同种类的对象。

public class WaterBottle<T extends Liquid> implements UniqueCap{}

但我看到泛型不仅仅用于类似容器的对象?如何设计这样的物体,他们考虑了什么?

最佳答案

您对 OOP 中各种功能的类比绝对是正确的。在谈论集合/容器/ HashMap 时,泛型绝对最有意义。不过,它们确实在其他地方也有用途。例如,如果银行要处理多种货币的票据,他们可以写 公共(public)类 moneyProcessor

但是,泛型不是必需的。在 Flight 界面的上下文中,没有太多理由使用泛型。这让我想到了另一点:

仅仅因为其他人以一种方式做某事并不意味着您必须那样做。OOP 非常灵活是有原因的。永远有不止一种正确的方法。如果一个方法将 Object 作为参数,那还不算世界末日。只要确保您以后可以阅读它即可。 :)

编辑:其他人也可以阅读。

关于java - 如何围绕面向对象设计进行思考,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30769537/

相关文章:

c++ - 友元函数是否违反封装?

c# - 如何在 C# 中实例化泛型方法?

java - session 超时混淆 - session.setMaxInactiveInterval(0)

Java XML读取问题: read different child tags

java - Netty 5不听java

java - 在 Netbeans 中将 JavaFx 项目转换为 .exe 和 .app

javascript - 如何在父类(super class)构造函数中初始化/设置值?在 typescript 中

kotlin - 类什么时​​候是数据类?

java - 两种创建具有相同结果的泛型数组的方法,但只有一种有效

C# 编译器 + 带装箱的通用代码 + 约束