Как мне определить черту с помощью субтитров, чтобы их методы принимали только общую реализацию? - PullRequest
5 голосов
/ 10 декабря 2011

Мой мета-вопрос был бы "Как мне задать этот вопрос вразумительно?"но, возможно, пример прояснит ситуацию:

trait Toolbox {
  trait Bolt
  trait Wrench {
    def tighten(b : Bolt) 
  }

  def getWrench : Wrench
  def getBolt : Bolt
}


object MetricToolbox extends Toolbox {
...
}

object EnglishToolbox extends Toolbox {
...
}

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

MetricToolbox.getWrench tighten EnglishToolbox.getBolt

, но следующее будет:

def doTighten(box : Toolbox) = box.getWrench tighten box.getBolt

Я точно знаю, что это возможно, потому что я слышал, как Мартин Одерский произнес это своими устами на встрече Скала вчера вечером, но в этот момент моя жена позвонила в мою камеру, и мне пришлось выскочить из комнаты, прежде чем он объяснилhow.

EDIT didierd указал, что мой код работает как написано.Он прав - я немного неясен в деталях, но это так.Естественный обратный вопрос: как я не могу это сделать?Ответ был довольно прост: поместите эти классы на один уровень с основной чертой.

trait Nail
trait Hammer {
  def pound(n : Nail)
}

trait Toolbox {
  trait Bolt
  trait Wrench {
    def tighten(b : Bolt) 
  }

  def getWrench : Wrench
  def getBolt : Bolt
  def getNail : Nail
  def getHammer : Hammer
}

 MetricToolbox.getHammer pound EnglishToolbox.getNail // this DOES compile

1 Ответ

8 голосов
/ 10 декабря 2011

Как написано, уже работает.Поскольку Bolt и Wrench вложены в Toolbox, Bolt, который вводит аргумент tighten, означает Bolt этого точного набора инструментов, а не Bolt любого набора инструментов.Они написаны соответственно someToolbox.Bolt, что означает Bolt точного экземпляра someToolBox и Toolbox#Bolt, что означает Bolt, определенный в типе Toolbox, независимо от набора инструментов insatance.Таким образом, Toolbox#Bolt является общим супертипом всех x.Bolt.

Здесь Bolt без оговорок означает this.Bolt, this являющийся включающим Toolbox.Таким образом, вы не можете смешивать.

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