Scala: наследовать абстрактные методы

У меня такая иерархия классов.

abstract class Element {
  var name: String
  var description: String 
}

class Group (var name : String, var description : String, var members: Set[Element] =Set()) 
extends Element{}

trait TypedElement extends Element{ 
  var types: Set[Type] 
}

trait ArchitecturalElement extends PropertyHolderElement with TypedElement

abstract class Component extends ConnectableElement with ArchitecturalElement {
  var subElements : Set[ArchitecturalElement]
 var interactionPoints : Set[InteractionPoint]
}

class SAComponent ( var name :String,
                var description : String,

                var types : Set[Type] = Set(),
                var subElements : Set[ArchitecturalElement] = Set(),
                var interactionPoints : Set[InteractionPoint] = Set()
                ) extends Component

Element — это корневой класс моей модели. Теперь я хочу поместить абстрактный метод «проверить» на элемент, который будет унаследован всеми моими классами. И реализовано только в бетоне. Как мне это сделать? Мои проверенные методы должны иметь разные подписи, и некоторые из них возвращают значение, а другие ничего не возвращают.

Например, я хотел бы что-то вроде этого:

 abstract class Element {
  var name: String
  var description: String 
  def validate (elem: Element)
}

class Group (var name : String, var description : String, var members: Set[Element] =Set()) 
extends Element{
validate (gr: Group) = {//the method body}
}

trait TypedElement extends Element{ 
  var types: Set[Type] 
  validate (ty : TypedElement )
}

trait ArchitecturalElement extends PropertyHolderElement with TypedElement {
validate (arel: ArchitecturalElement )
}

abstract class Component extends ConnectableElement with ArchitecturalElement {
  var subElements : Set[ArchitecturalElement]
 var interactionPoints : Set[InteractionPoint]
 validate (el : Component, subElem: Set[ArchitecturalElement]) : Boolean = {//the method body}
 //here, I need the return value to avoid cycles of recursion
}

person user1826663    schedule 29.11.2012    source источник


Ответы (1)


Этого нельзя делать. Переопределенные методы должны иметь совместимые подписи. Это означает, что одинаковое количество аргументов, контравариантных в args, ковариантных в возврате. Это означает, что ваши аргументы могут быть супертипами переопределенных аргументов, а возвращаемый тип может быть подтипом переопределенного возвращаемого типа, но они не могут изменяться произвольно.

Теперь вы можете нарушать эти правила, но тогда вы не переопределяете, а просто перегружаете, и вам все равно нужно будет предоставить реализацию абстрактного метода.

person Dave Griffith    schedule 29.11.2012