2016-09-07 2 views
0
내가 ArrayBuffer 컬렉션에 다른 개체를 추가하고 싶었

에 다른 개체의 컬렉션을 추가, 그래서가 ArrayBuffer

case class base (a:String,b:String) 
case class Super1 (a:String, b:String, c:String) extends base(a,b) 
case class Super2 (a:String, b:String, c:String, d:String) extends base(a,b) 
val array=New ArrayBuffer[base]() 
val super1=new Super1("1","2","super1") 
val super2=new Super2("1","2","super2","super2") 
array+=(super1) 
array+=(super2) 

사실 기본 클래스를 정의해야합니다, 위의 코드를 테스트하지만 알고 싶어하지 않은 파생 클래스의 모든 매개 변수 값이 필요하므로 추가하는 객체가 기본 클래스 대신 Super1 또는 Super2 인 경우

답변

1

첫 번째 문제는 case class에서 상속받을 수 없다는 것입니다. 스트레이트 class 또는 trait을 사용하면 문제가 없습니다.

ArrayBuffer에 클래스 인스턴스를로드 한 다음 패턴 인스턴스를 추출한 후에 패턴 일치를 사용하여 올바른 유형을 결정할 수 있습니다.

array+=super1 
array+=super2 
array.head match { 
    case Super1(a,b,c) => println("got 1") 
    case Super2(a,b,c,d) => println("got 2") 
    case _ => println("got bad") 
} 

"테스트되지 않은"코드에는 몇 가지 다른 문제가 있지만 쉽게 해결할 수 있습니다. (:베이스 해당) = { 을 경우 (식에서 나타내지 == that.length) 다른 (이 경우에 I는 [베이스] 정렬 연장됨 기본 클래스에 대한 특성을 추가하는 경우

+0

안녕하세요 {DEF 비교. 길이> that.length) else -1 }} 이들을 하위 클래스에 구현해야합니까? – Luckylukee

+0

@ user2021147; 첫째 - 이전 질문의 댓글 섹션에서 새로운 질문을하는 것이 적절하지 않습니다. 왜냐하면 A) 적은 사람들이 그것을보고 답변을 제공 할 것이고, B) 새로운 질문에 대답하는 사람은 누구든지 상향 투표 및 평판 포인트를 얻을 수 없기 때문입니다. . 두 번째 -이 질문은 REPL 또는 IDE에 몇 줄의 코드를 놓기 만하면 쉽게 대답 할 수 있습니다. 3rd - No.베이스가 Ordered이면 모든 하위 클래스도 마찬가지입니다. Ordered 규칙을 변경하고 싶지 않으면'override'가 필요 없습니다. – jwvh