gpt4 book ai didi

java - 如何决定保留哪些条件以及将哪些条件溶解为多态性

转载 作者:行者123 更新时间:2023-11-30 07:14:50 25 4
gpt4 key购买 nike

简要引用:http://www.refactoring.com/catalog/replaceConditionalWithPolymorphism.html

澄清我的问题:

网上有太多文章在谈论使用多态而不是继承。如果这是真的,那么“if-elses”和“switches”不应出现在大多数 Java 代码中。

他们这样做的事实意味着:

  1. 有些情况下条件不能转化为多态。

  2. 每个带有 if else 的代码都有可能被重构,但它们没有完成。

现在我的问题。

  1. 以上哪个选项是正确的?

  2. 如果选项 1 为真,那么“如何确定 if-else 是否可以被多态性替代”?

最佳答案

这个想法是为了避免测试对象类型的条件,例如

public void doThing() {
if (myObject instanceof ClassA)
doSomething();
else if (myObject instanceof ClassB);
doSomethingElse();
}

我们想要避免此类测试的原因是它们是我们代码中 future 错误的来源。当一个新类被添加到我们的系统时,所有这些测试都必须被审查并可能被更改。迟早,我们人类会犯错误,然后我们就会有错误代码。此外,它使我们的代码更复杂,而且通常更慢。在这个简单的示例中,这并不明显,但如果我们以不同的方式测试一堆类型,它就会很明显。

在这种情况下,myObject 是 ClassAClassB 继承的类的实例;让我们调用该父类 ClassP。所以我们可以避免像这样向 ClassP 添加一个名为 doSomething 的方法

class ClassP {
// lots of ClassP code

public void doSomething() {
// basic implementation of method
}
}

假设此代码适用于 ClassA,因此对于 ClassA 实例,我们只需编写代码

myObject.doSomething();

但是对于 ClassB 我们需要不同的行为,所以我们编码

class ClassB extends ClassP {
// lots of ClassB code

public void doSomething() {
// different implementation of method
}
}

现在我们可以做

myObject.doSomething();

也用于 ClassB 实例。我们不再需要那个条件。

强大的是,这段代码还将处理将来添加到继承层次结构中的新类型,而无需更改。所以如果我们现在添加一个类

class ClassC extends ClassP {
// lots of ClassC code

public void doSomething() {
// totally different implementation of method
}
}

然后

myObject.doSomething();

仍然有效,当 myObjectClassC 实例时调用新类中的方法,甚至不需要重新编译!

多态性有几种,参见维基百科:Polymorphism (computer science)Polymorphism in object-oriented programming .正如您在这些页面上看到的那样,这是一个有争议的领域。

我们在这里使用的类型称为子类型多态性,由于它的实现方式也称为动态绑定(bind)

关于java - 如何决定保留哪些条件以及将哪些条件溶解为多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18304251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com