Наследование защищенного от пакета метода классом в другом пакете - PullRequest
5 голосов
/ 31 декабря 2011

Я нахожусь в ситуации, когда мне нужно смешать черту, определенную в другом пакете. Чтобы помочь с тестированием, защищенный метод в этой черте является квалифицированным пакетом. Вот пример:

package A {
  trait X {
    protected[A] def method(arg: Int)
  }
}

package B {
  class Y extends A.X {
    protected[A] def method(arg: Int) { }
  }
}

Компиляция с помощью скаляка 2.9.1 дает:

test.scala:9: error: A is not an enclosing class
    protected[A] def method(arg: Int) { }

Изменение «защищенного [A]» в классе Y на любой другой модификатор доступа приводит к этому:

test.scala:9: error: overriding method method in trait X of type (arg: Int)Unit;
 method method has weaker access privileges; it should be at least protected[A]
    override protected def method(arg: Int) { }

У меня такой вопрос: если предположить, что определение черты X не может измениться, есть ли какие-либо изменения в классе Y, которые позволили бы ему расширить черту X? (при сохранении некоторого уровня «защищенного» доступа)

Если это невозможно, есть ли другие рекомендуемые стратегии проектирования, чтобы обойти это? (кроме публичного указания метода)

1 Ответ

2 голосов
/ 01 января 2012

Я решил эту проблему с помощью адаптера.Хотя я не могу изменить исходную черту, я могу добавить другую в том же пакете (но по другим причинам не имеет смысла помещать класс Y в этот пакет).'AdapterMethod' в классе Y подходит для пакета B в качестве эксперимента, но, скорее всего, это не нужно для моего варианта использования.Следующие компиляции в Scala 2.9.1:

package A {
  trait X {
    protected[A] def method(arg: Int)
  }

  trait PackageAdapter {
    protected[A] def method(arg: Int) { adapterMethod(arg) }

    protected def adapterMethod(arg: Int)
  }
}

package B {
  class Y extends A.X with A.PackageAdapter {
    protected[B] def adapterMethod(arg: Int) { }
  }
}

Я не без ума от этого решения, но оно не так уж плохо.Класс Y в некотором смысле исключительный, поскольку остальные классы, использующие черту X, находятся в пакете A (класс Y должен быть в пакете B по многим другим причинам).Есть идеи получше?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...