0

このようなクラス階層があります。

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 に抽象メソッド「validate」を配置して、すべてのクラスに継承させたいと考えています。そして、具体的にのみ実装されます。どうすればいいですか?検証済みのメソッドには異なる署名が必要で、値を返すものもあれば、何も返さないものもあります。

たとえば、次のようなものが欲しいです。

 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
}
4

1 に答える 1

0

これはできません。オーバーライドされたメソッドには、互換性のあるシグネチャが必要です。これは、同じ数の引数、引数で反変、戻りで共変であることを意味します。つまり、引数をオーバーライドされた引数のスーパータイプにすることができ、戻り値の型をオーバーライドされた戻り値の型のサブタイプにすることができますが、任意に変更することはできません。

これらの規則に違反することはできますが、オーバーライドするのではなく、単にオーバーロードするだけであり、抽象メソッドの実装を提供する必要があります。

于 2012-11-29T14:58:09.847 に答える