자기 자신을 다른 Type으로 선언이 가능하다.
예시를 보자
Graph라는 클래스와
abstract class Graph {
type Edge
type Node <: NodeIntf
abstract class NodeIntf {
def connectWith(node: Node): Edge
}
def nodes: List[Node]
def edges: List[Edge]
def addNode: Node
}
상속을 받아 또 추상화 클래스로 만들어진 DirectedGraph가 있고 여기에서 자시히 보면 protected def newEdge(from: Node, to: Node): Edge 이렇게 구현이 되어있는데.. NodeImpl 구현부에 보면 newEdge(this, node) 보면 this라고 선언이 되어있다. 하지만 Node 타입만 받기 때문에 오류가 난다.
abstract class DirectedGraph extends Graph {
type Edge <: EdgeImpl
class EdgeImpl(origin: Node, dest: Node) {
def from = origin
def to = dest
}
class NodeImpl extends NodeIntf {
def connectWith(node: Node): Edge = {
val edge = newEdge(this, node)
edges = edge :: edges
edge
}
}
protected def newNode: Node
protected def newEdge(from: Node, to: Node): Edge
var nodes: List[Node] = Nil
var edges: List[Edge] = Nil
def addNode: Node = {
val node = newNode
nodes = node :: nodes
node
}
}
그래서 아래와 같이 선언을 해주는 것이다. self: Node => 이렇게 선언을 하면 문법적인 오류없이 해결이 된다.
abstract class DirectedGraph extends Graph {
...
class NodeImpl extends NodeIntf {
self: Node =>
def connectWith(node: Node): Edge = {
val edge = newEdge(this, node) // now legal
edges = edge :: edges
edge
}
}
...
}
'Development > Programming' 카테고리의 다른 글
[Scala] Generic function (0) | 2015.09.05 |
---|---|
[Scala] Local Type Inference (0) | 2015.03.17 |
[Scala] Lower Type Bounds (0) | 2015.03.12 |
[Scala] Upper Type Bounds (0) | 2015.03.11 |
[Scala] Traits (0) | 2015.03.07 |