java - Java中的隐式对象类型?

标签 java casting polymorphism

这并不完全是隐式类型转换的定义,但我很好奇我用这个定义打破了多少标准......

我正在 Java 中创建一个抽象类,它基本上根据传递到构造函数中的字符串来转换其变量。

例如:

public abstract class MyClass {

    Object that;

    public MyClass(String input){
        if("test1".equals(input){
            that = new Test1();
        }
        else{
            that = new Test();
        }
    }

    public void doSomething(){
        if(that instanceof Test1){
            //specific test1 method or variable
        } else if(that instanceof Test2)}
            //specific test2 method or variable
        } else {
            //something horrible happened
        }
    }
}

你明白我的意思了吗?现在我遇到的问题是我的编译器希望我将 that 显式转换为 doSomething 中的 Test1Test2 > 方法 - 我理解,因为编译器不会假设它是某种对象类型,即使 if 语句几乎保证了该类型。

我想我的意思是,这是一个有效的解决方案吗?

我有其他类,它们基本上都做同样的事情,但根据一个简单的差异使用两个不同的库,并且认为这个类可以帮助我轻松跟踪和更改所有其他对象。

最佳答案

你是对的。这是在设计中实现多态性的一种可怕的方式。您考虑过使用工厂吗?策略对象?听起来您想要实现的目标可以使用这些模式(也许还有其他模式)的组合以更松散耦合的方式实现。

对于doSomething的多态性,例如:

interface Thing {
    public void doThing();
}

class Test1 implements Thing {
    public void doThing() {
        // specific Test1 behavior
    }
}

class Test2 implements Thing {
    public void doThing() {
        // specific Test2 behavior
    }
}

class MyClass {

    Thing _thing;

    public void doSomething() {
        _thing.doThing();    // a proper polymorphism will take care of the dispatch,
                             // effectively eliminating usage of `instanceof`
    }
}

当然,您需要将 Test1Test2(以及其他具体的 Thing 类,现有的和计划的)的行为统一到一个一组通用接口(interface)。

PS:此设计俗称Strategy Pattern .

关于java - Java中的隐式对象类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4902599/

相关文章:

java - 如何编写快速排序分区函数

java - 为什么三元运算符意外地转换为整数?

PHP:将美元转换为美分

c++ - 我在理解继承和让多个类协同工作时遇到问题?

作为类成员的智能指针的 C++11 索引 vector

c++ - 多态和继承有什么区别

javascript - Angular 在浏览器上下载 csv 文件

java - 使用 spring-hateoas 使用基于 HAL 的 REST 服务

c - 从 void* 到 char** 的无效转换

c++11 - 如何使用 std::shared_ptr 实现多态性?