1
내가 스칼라에 마틴 오더 스키의
프로그래밍에 추상적 인 유형의 동물/식품 예를하려고했다
, 스칼라에 관련된 추상 유형이 없을 때 동적 바인딩이 없습니까?
class Food
abstract class Animal {
type SuitableFood <: Food
def eat(food:SuitableFood)
}
class Grass extends Food
class Cow extends Animal {
type SuitableFood=Grass
override def eat(food:SuitableFood) {}
}
val bessy:Animal = new Cow
bessy.eat(new Grass)
나는 다음과 같은 오류있어 : 마틴에 의해 원래의 예는 bessy.eat(new Fish)
scala> <console>:13: error: type mismatch;
found : Grass
required: bessy.SuitableFood
bessy.eat(new Grass)
^
했다 , 확실히 실패 할 것입니다, 그러나 나는 그것이 Grass
을 위해 또한 실패 할 것이라는 점을 예상하지 않았습니다. 위 오류는 을 Animal
: val bessy:Cow = new Cow
대신 Cow
이되도록 놓으면 피할 수 있습니다.
여기서 동적 바인딩이 작동하지 않는다는 의미입니까?
편집 : 간단한 동적 스칼라에서 일반 상속 바인딩 :
abstract class Parent {
def sig:String = "Parent"
}
class Child extends Parent {
override def sig:String = "Child"
}
그리고 x:Parent
뿐만 아니라 아이 준 곳이 있었다 :
scala> new Child().sig
res1: String = Child
val x:Parent = new Child()
x: Parent = [email protected]
x.sig
res2: String = Child
글쎄, 내가 동적 바인딩 개념을 잘못 생각하고 있습니까? Java의'List'는'LinkedList'와'ArrayList'를 가지고 있습니다. 그래서'List'에'xs.get (idx)'를 호출하면,'ArrayList' 구현 일 때'ArrayList' 버전을 얻을 수 있습니다. 나는 스칼라가 이것에서 벗어날 것을 기대하지 않았다. – lcn
@lcn - 유형이 일치해야합니다. 당신의 "간단한"예제는'Parent.sig'와'Child.sig'와 같은 타입 시그니처를 가지고 있습니다. C++에서 "동적 바인딩"유형의 상속은 잘 작동하지만 주어진 유형을 따라야합니다. –
그래서 추상적 인 타입이 관련되어있을 때,'eat' 메소드는 * 다른 * 시그니처를 가지므로 다른 메소드입니까? 이 유형은 추상적 유형의 목적에 더 잘 어울린다는 것을 이해하지만 실제로 여기에 * NO * 동적 바인딩이 있음을 문서화해야합니다. – lcn