java 子类或字段,语义良好
java subclass or field, good semantics
请帮助我决定在以下情况下哪种方法是合理的。对象:
public class FunctionCall {
private String functionName;
private List<Exp> args;
...
}
在一个非常特殊的 case/check 中,需要以某种方式识别对象。
可能的方法:
FunctionCall
class 成为一个属性,但有人怀疑这会污染整体语义,因为属性不应该可见 "globally".
SpecialFunctionCall
继承了FunctionCall
并且在非常特殊的情况下可以用instanceof
来标识。这样就很理想了,唯一怀疑会不会滥用继承的目的?
- 非常欢迎任何其他建议。
提前致谢。
从你写的来看,FunctionCall
对象似乎只是一个带有数据的值对象,而不是一些评估自身和 returns 值的对象。对于多种类型的此类对象,您需要有一种方法来消除您正在使用的对象类型的歧义。
对于那部分,我建议您使用枚举来消除歧义,而不是使用 instanceof
运算符或 class 反射。您也可以用它创建漂亮的 switch-case
命令。
public class FunctionCall {
// ...
public MyType getType() {
return MyType.BASIC_FUNCTION_CALL;
}
}
枚举的另一个好处是,它 class 可以有自己的字段。为枚举常量设置一些 final
字段,放入描述其某些特征的值,然后您可以在处理它的逻辑中使用此信息,这对您有利。
不过,至于您问题的实际答案,由于对您的问题知之甚少,不太可能。在某些情况下,继承更好,在另一些情况下,组合更好。在这两种情况下,某种接口都很好,它可以声明 getType
方法。
你真正需要的是将Java、polymorphism
和'inheritance'三个主要原则中的两个结合起来使用。多态性是 OOP 的特征之一,它允许我们以不同的方式执行单个操作。这意味着对象的行为可以根据特定情况或情况而改变。
在您的情况下,您可以创建两个 class,一个 FunctionCall
和一个 SpecialFunctionCall
。后者应该 extends
第一个具有特殊行为的。
然后,当您的特殊情况出现时,您将使用第二个 class ,它的行为与第一个不同。
通过这种方式,您可以保证父项具有每个案例的功能 class FunctionCall
。
见下面的使用示例:
public class SpecialFunctionCall extends FunctionCall{
//your special logic goes here
...
}
请帮助我决定在以下情况下哪种方法是合理的。对象:
public class FunctionCall {
private String functionName;
private List<Exp> args;
...
}
在一个非常特殊的 case/check 中,需要以某种方式识别对象。 可能的方法:
FunctionCall
class 成为一个属性,但有人怀疑这会污染整体语义,因为属性不应该可见 "globally".SpecialFunctionCall
继承了FunctionCall
并且在非常特殊的情况下可以用instanceof
来标识。这样就很理想了,唯一怀疑会不会滥用继承的目的?- 非常欢迎任何其他建议。
提前致谢。
从你写的来看,FunctionCall
对象似乎只是一个带有数据的值对象,而不是一些评估自身和 returns 值的对象。对于多种类型的此类对象,您需要有一种方法来消除您正在使用的对象类型的歧义。
对于那部分,我建议您使用枚举来消除歧义,而不是使用 instanceof
运算符或 class 反射。您也可以用它创建漂亮的 switch-case
命令。
public class FunctionCall {
// ...
public MyType getType() {
return MyType.BASIC_FUNCTION_CALL;
}
}
枚举的另一个好处是,它 class 可以有自己的字段。为枚举常量设置一些 final
字段,放入描述其某些特征的值,然后您可以在处理它的逻辑中使用此信息,这对您有利。
不过,至于您问题的实际答案,由于对您的问题知之甚少,不太可能。在某些情况下,继承更好,在另一些情况下,组合更好。在这两种情况下,某种接口都很好,它可以声明 getType
方法。
你真正需要的是将Java、polymorphism
和'inheritance'三个主要原则中的两个结合起来使用。多态性是 OOP 的特征之一,它允许我们以不同的方式执行单个操作。这意味着对象的行为可以根据特定情况或情况而改变。
在您的情况下,您可以创建两个 class,一个 FunctionCall
和一个 SpecialFunctionCall
。后者应该 extends
第一个具有特殊行为的。
然后,当您的特殊情况出现时,您将使用第二个 class ,它的行为与第一个不同。
通过这种方式,您可以保证父项具有每个案例的功能 class FunctionCall
。
见下面的使用示例:
public class SpecialFunctionCall extends FunctionCall{
//your special logic goes here
...
}