这并不完全是隐式类型转换的定义,但我很好奇我用这个定义打破了多少标准......
我正在 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
中的 Test1
或 Test2
> 方法 - 我理解,因为编译器不会假设它是某种对象类型,即使 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`
}
}
当然,您需要将 Test1
和 Test2
(以及其他具体的 Thing
类,现有的和计划的)的行为统一到一个一组通用接口(interface)。
PS:此设计俗称Strategy Pattern .
关于java - Java中的隐式对象类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4902599/