繁体   English   中英

抽象类中的公共变量

[英]Common variable in abstract class

我有一个由 15 个类扩展的抽象类。 所有 15 个类都有称为 exec(map: HashMap) : Unit 的通用方法代码。 于是想到在抽象类中实现这段代码。 这个 exec() 代码虽然有副作用。 它将结果变量分配给 exec() 的输出。 (我无法更改 exec 的签名,因为它是从某个外部接口实现的)。 输出基于实现类传入的映射。

所以我很困惑,如果我在抽象类中实现 exec() ,结果变量的值会被破坏吗?

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 个类中的每个类中都覆盖它并为每个类设置一个本地结果变量是没有意义的。 这种事情有最佳实践吗?

您可能混淆了类和实例。 A1A2等是不同的类,它们共享AbstractMyClass一些实现。 但是每次创建这些类之一的新对象时,它都会包含一个AbstractMyClass类型的新对象。 每个对象都有不同的result值,因此在一个对象上调用方法不会影响另一个对象中的值。

然而,这里的整体设计很差,而且没有功能。 使用var是一个不好的信号,并且将var设为公开会导致无法知道谁可能修改了该值。

如果exec返回结果而不是存储它会更好,从而消除对var的需要。 如果后续计算需要新值,则可以将该新值传递给这些方法,而不是从类状态中读取。

如果确实需要具有可变值,请确保它们是private并提供修改它们的方法。 并避免在主处理代码中写入这些值,以保持该部分代码的功能。 如果不写入任何可变值,则更容易验证和测试处理代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM