代码之家  ›  专栏  ›  技术社区  ›  Dexter

Scala性状与遗传

  •  0
  • Dexter  · 技术社区  · 4 年前

    我的Scala类结构如下:

    trait ActualClass extends ParentClass {
      override def method1(inputStr:String):String = {
        "actual "+ inputStr
      }
      def execute():String = {
        this.method1("test")
      }
    }
    
    trait WithClass extends ParentClass {
      override def method1(inputStr:String):String = {
        "with "+ inputStr
      }
    }
    
    class ParentClass {
      def method1(inputStr:String):String = {
        "parent "+ inputStr
      }
    }
    
    object TestClass extends App{
      val actualClass = new ActualClass with WithClass {
      }
      println(actualClass.execute())
    }
    

    1. 使用此方法1在实际类中执行方法:打印“With Test”
    2. 使用超级方法1在实际类中执行方法:打印“父测试”

    我需要打印:“实际测试”

    0 回复  |  直到 4 年前
        1
  •  4
  •   Dmytro Mitin    4 年前

    ActualClass#method1 在内部 ActualClass .

    "actual test" val actualClass 反之亦然

    val actualClass = new WithClass with ActualClass
    

    (根据线性化顺序选择方法实现)。

    一般来说,你不能特别打电话 SomeClass#someMethod 在内部 SomeClass 具有 this.someMethod this 以这种方式。所以 X=ActualClass X#method1 X#execute

    这就是为什么有语法 super[A].someMethod this[A].someMethod .

    你也可以试试

    trait ActualClass extends ParentClass {
      override def method1(inputStr:String):String = {
        "actual "+ inputStr
      }
      def execute():String = {
        (new ActualClass {}).method1("test")
      }
    }