我有一节抽象课,延长了15节课。所有15个类都有公共方法代码exec(map:hashmap):unit。所以我想在抽象类中实现这个代码。但是这个exec()代码有副作用。它为exec()的输出分配一个结果变量(我无法更改exec的签名,因为它是从某个外部接口实现的)。输出基于实现类传入的Map。
所以我很困惑,如果我在抽象类中实现exec(),result vairable的值会被破坏吗?
abstract class AbstractMyClass extends externalIntefaceA{
var result : DataFrame = _
override def exec(map : HashMap): Unit{
//some logic
result = map.get(key1)
}
def eval
def getResult : DataFrame = result
}
class A1 extends AbstractMyClass{
override def eval(map : HashMap){
map.add("key1","value1")
}
}
class A2 extends AbstractMyClass{
override def eval(map : HashMap){
map.add("key1","value2")
}
}
class A3 extends AbstractMyClass{
override def eval(map : HashMap){
map.add("key1","value3")
}
}
好吧,我不确定我是否能够很好地解释它,但是结果变量会被不同的实现类损坏吗?我想在抽象类中使用exec()方法,因为它的其余代码在所有15个类中都是相同的。因此,在15个类中的每个类中重写它并为每个类设置一个局部结果变量是没有意义的。这种事情有没有最佳实践?
1条答案
按热度按时间2w2cym1i1#
您可能混淆了类和示例。
A1
,A2
是不同的类,它们共享AbstractMyClass
. 但每次为这些类中的一个创建新对象时,它都会包含一个类型为的新对象AbstractMyClass
. 每个对象都有不同的result
值,因此对一个对象调用方法不会影响另一个对象中的值。然而,这里的整体设计很差,功能不强。使用
var
是个坏兆头var
公众不可能知道是谁在修改这个值。最好是
exec
返回结果而不是存储结果,这样就不需要var
. 如果后续计算需要新值,则可以将新值传递给这些方法,而不是从类状态读取。如果真的需要有可变值,请确保它们是可变的
private
并提供修改方法。并避免在主处理代码中写入这些值,以保持代码的这部分功能正常。如果处理代码不写任何可变值,那么验证和测试它就更容易了。