如何围绕面向对象设计

时间:2015-06-11 00:19:50

标签: java oop generics software-design

面向对象的设计是一个非常简洁的概念,但我在如何围绕其大部分方面挣扎。我认为良好的面向对象设计的关键是掌握如何看待它。我通常以这种方式看待面向对象:

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

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

方法就像行动,动词,实体的能力

接口就像你可以在一个物体上注入的能力。它也可能是一个A或者可以做到的'关系,其实施不是一成不变的。超人是一个氪星,是一个氪星人,具有一系列特殊能力,如飞行,冻结等等。超人飞行不同于绿灯侠和悟空,特别是蝙蝠侠,这就是为什么如果你和飞行作为接口可能是一个好主意#39;重新创造一个虚构的宇宙。

public class SuperMan extends Man implements Kryptonian{}

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

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

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

在这个例子中,Flight与T相结合,T可以是超级英雄,鸟类或任何可以飞行的东西。但是,我真的应该如何想象吗?因为这看起来像普通接口一样吗?虽然参数化接口仍然是一个接口,但与T类型的耦合实在让我感到困扰。而且,当您在参数类型上添加有界限制时,事情也会变得复杂。

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

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

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

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

但是我发现Generics不仅仅用在像容器一样的物体上?如何设计这样的物体,他们考虑了什么?

2 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:0)

它在处理泛型时使用T的约定。它使代码可读,因为阅读代码的其他人会立即知道你指的是通用的,没有特定的