Вызовите метод внутри вложенного статического класса из внешнего класса, используя трейт

У меня есть статический класс «Внутренний» и вложенный статический класс «Глубже» в двух разных классах A, B. Класс «Внутренний» реализует трейт C, который имеет метод ping(). Я хочу выполнить метод hello() (принадлежащий Deeper) из метода ping() таким образом, чтобы каждый раз я получал либо «Hello A», либо «Hello B» в зависимости от класса, вызвавшего трейт. Вот что я написал (использую katalon-studio):

public class A
{
  static class Inner implements C{
     static class Deeper{ 
         static void hello(){ println 'Hello A'}
    }
  }
}
public class B
{
  static class Inner implements C{
     static class Deeper{ 
         static void hello(){ println 'Hello B'}
    }
  }
}
public static trait C {
     static void ping() {
          this.Deeper.hello()
     }
}

A.Inner.ping()
B.Inner.ping()

Я получил следующую ошибку:

17 августа 2018 г., 16:46:57 — [ОШИБКА] — Тестовые наборы/V2/Общие/Черновик НЕ ПРОШЕЛ из-за того, что переменная «Глубже» не определена для тестового примера.


person MaterialZ    schedule 16.08.2018    source источник
comment
А как насчет this.getClass()? Или проверить стек Thread.currentThread()?   -  person ernest_k    schedule 16.08.2018


Ответы (2)


Рассмотрим этот код:

class A implements C {}
class B implements C {}

trait C { 
    def whoAmI() {
        this.class.simpleName
    } 
}

// ---- main

assert "A" == new A().whoAmI() 
assert "B" == new B().whoAmI() 
person Michael Easter    schedule 16.08.2018
comment
Где вы определили simpleName? - person MaterialZ; 16.08.2018
comment
getSimpleName() — это метод Class в Java; в Groovy мы можем сократить геттеры с x.getFoo() до x.foodocs.oracle.com/javase/7/docs/api/java/lang/ - person Michael Easter; 16.08.2018
comment
Ваш код работает, но когда я пытаюсь реализовать его в своем скрипте, я получаю взамен «Класс». - person MaterialZ; 16.08.2018
comment
Не могли бы вы обновить вопрос, чтобы он отражал вашу ситуацию? - person Michael Easter; 16.08.2018

Не удалось найти ответ на это. Однако, используя нестатические классы, это можно было бы реализовать следующим образом:

public class A{
   class Inner implements C{
      A.Inner.Deeper d = new A.Inner.Deeper()
      class Deeper { 
          void hello(){ 
             println 'Hello A'  
          }
      }
   }
}
public class B{
   class Inner implements C{
      B.Inner.Deeper d = new B.Inner.Deeper()
      class Deeper{ 
          void hello(){ 
             println 'Hello B' 
          }
      }
   }
}

public trait C{
      public void ping(){
         this.d.hello()
      }
}

new A.Inner().ping()
new B.Inner().ping()
person רועי וינרב roi weinreb    schedule 21.08.2018