Scala类替换

时间:2012-01-25 17:27:27

标签: java scala aop substitution

有一个包含类的Java库:

class DefaultFieldFactory {
  ...
  public static String createCaptionByPropertyId(Object propertyId) { ... }
  ...
}

class FieldFactory extends DefaultFieldFactory {
  ...
  // Lot of methods that use DefaultFieldFactory.createCaptionByPropertyId
  ...
}

我在Scala项目中使用FieldFactory类,我需要更改createCaptionByPropertyId方法。

如果没有AOP并重写FieldFactory类,我怎么能这样做?

是否可以在包中替换DefaultFieldFactory类实现?它相对简单而且简短。

提前致谢, 艾格。

2 个答案:

答案 0 :(得分:2)

静态类将进入Scala中的object,它不会继承DefaultFieldFactory的静态方法 - 事实上,它很好地反映了您无法覆盖静态的事实。

这就是静电不受欢迎的一个原因。

答案 1 :(得分:1)

我认为有一种hacky方式可以做到这一点......但是如果你有原始java类的源代码,我强烈建议你改一下。

如果没有,您可以创建DefaultFieldFactory的新实现作为类中的对象,隐藏您班级中的原始实现。然后DefaultFieldFactory对象的实现可以调用原始的java implimentations。

// in package x.y.a
class DefaultFieldFactory {
  ...
  public static String createCaptionByPropertyId(Object propertyId) { ... }
  ...
}

// in package x.y.b
class FieldFactory extends DefaultFieldFactory {

  object DefaultFieldFactory{


    def createCaptionByPropertyId(propertyId: AnyRef): String { 
      //import the original implimentation
      import x.y.b.DefaultFieldFactory._
      ... 
    }
  }


  // Lot of methods that use DefaultFieldFactory.createCaptionByPropertyId
  ...
}

就像我说的......不太好!