【问题标题】:All methods in one class or polymorphism implementation?一个类或多态实现中的所有方法?
【发布时间】:2013-05-27 19:17:54
【问题描述】:

您需要了解以下内容才能理解该问题:

  1. 我想将一个名为 SCL 的类连接到一个名为 Region 的类。
  2. 现在我有很多不同的方式我想连接一个实例 这 2 个类。
  3. 这是用 Java 编写的
  4. 没有使用全局变量

所以我可以创建几个利用多态性的类(大约 9 个),但是每个类只有一个名为 connect(...) 的方法,其中包含许多不同的参数列表。我认为这被称为函子类。

例如一个类“SCLToRegionOverlapCircleConnect”将有一个看起来像这样的连接方法

public void connect(SCL scl, Region region, int radius, int overlapPercentage) {...} 

虽然“RegionToRegionNonOverlapSquareConnect”类将有一个看起来像的连接方法

public void connect(Region bottomRegion, Region topRegion, int sideLength) {...}

或

我可以只创建一个名为 ConnectionTypes 的类,并且只有 9 个不同的方法,每个方法都有不同的方法签名。

每种实现的优点和缺点是什么?谢谢!

【问题讨论】:

  • 在使用第二种解决方案时,可扩展性/可维护性/可读性处于相当大的危险之中。
  • @FlorisVelleman - 我认为不会超过第一个。
  • 一种连接方式与另一种连接方式有何区别?它们的行为是否不同,具有不同的参数,或者它们只是标记不同?如果连接的结果是某种连接对象,那么不同的连接方式会产生不同类型的连接对象吗?
  • 您没有详细说明,但您可以通过 9 种或更多方式连接这两个类似乎很奇怪。也许你应该重新考虑一切。
  • connect?你能详细说明一下吗..

标签: java polymorphism implementation


【解决方案1】:

如果您使用多态性,那么您将在实例化 SCL 对象时确定连接方法。那有意义吗?或者 SCL 类是否可以在其生命周期中以各种不同的方式连接到区域?在这种情况下,多态性没有意义。我们不知道的一个重要方面是connect(...) 方法的参数会发生什么。它们是否需要存储在 SCL 类中,在这种情况下,具有不同参数的多态性可能再次有意义,以便每个类都可以存储适当的参数。

另一个想法是,将 SCL 类连接到区域的行为真的是 SCL 类的一种方法,还是应该存在于其他地方?

【讨论】:

    【解决方案2】:

    我建议你使用第二个。

    1. 类更少,因此项目比其他方式更清晰。
    2. 当你想使用你的 另一个项目(例如)中的方法,但只有一个类。
    3. 在编程时,一条规则是不要重复代码;使用 9 个类, 你必须写 9 次声明,也许要声明 9 乘以相同的全局变量,使用比使用更多的内存 一。
    4. 重载,这意味着如果你必须做一件事 但是以多种方式(例如,您必须打印一些对象,并且 结果将是一个字符串,但您需要将其写成不同的 一种类型的对象等,你可以使用这种技术)你可以写 9 个方法名称相同,输出相同,但输入不同。
    5. 继承:如果你想创建一个继承那些 方法,你必须只使用一个类,因为 java 不支持 多重继承。

    我看不到任何 CON,除了您必须重新初始化全局变量以避免出现问题。

    【讨论】:

      【解决方案3】:

      让我直说两点:

      • 您考虑的是命令模式,而不是函子模式。不同的是后者也有获取返回值的方法,但是你的connect方法是无效的。
      • Functor 模式不会为您的每个connect 方法提供不同的签名;相反,每个具体的类都有专门的参数设置器(特定于您想要连接的特定方式)和相同的无参数 public void connect() 方法。后者将是通用 Connect 超类型中声明的唯一方法。

      如果你愿意,我可以提供一些示例代码。

      专业人士:如果在您的代码中的任何地方都可以使用 Connect 命令,而无需知道您正在处理的 9 种方式中的哪一种,那么命令模式就是您的朋友。

      缺点:你会有更多的代码,封装纯功能会大大降低你的代码的可理解性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-25
        • 1970-01-01
        • 1970-01-01
        • 2018-04-13
        • 1970-01-01
        • 2012-10-22
        相关资源
        最近更新 更多