[SCALA] 왜 "추상적 오버라이드 (override)는"혼자 subtrait에서 "재정의"를하지 필요합니까?
SCALA왜 "추상적 오버라이드 (override)는"혼자 subtrait에서 "재정의"를하지 필요합니까?
나는 추상적 인 무시가 도입 스칼라 프로그래밍의 섹션을 읽을 수 있지만 나는 아직도 정확하게 이러한 수정의 결합에 의해 표시되는 것을 혼동하고있다. 사용이 수식은 아래에 붙여있는 코드의 조각 :
trait Doubling extends IntQueue {
abstract override def put(x: Int) { super.put(2 * x) }
}
특히,이 경우 추상의 목적을 혼동하고, 왜 우리는 단순히 재정의 키워드로 예상 결과를 얻을 수 없습니다. 우리는 슈퍼에 대한 호출을 포함하지 않은 경우, 우리는 키워드 추상적를 필요? 그 이유는 무엇? 이 스택 특성에 관한 나는이 키워드 콤보에 대한 자세한 설명을 찾고 있어요.
해결법
-
==============================
1.그 이유는 기본 클래스 메서드가 추상적이라는 것이다
그 이유는 기본 클래스 메서드가 추상적이라는 것이다
abstract class IntQueue { def get(): Int def put(x: Int) }
당신이 특성에 추상적 인 넣지한다면 당신은 당신이 추구 한 설명과 함께 결국 :
trait Doubling extends IntQueue { override def put(x: Int) { super.put(2 * x) } } <console>:9: error: method put in class IntQueue is accessed from super. It may not be abstract unless it is overridden by a member declared `abstract' and `override' override def put(x: Int) { super.put(2 * x) }
그래서 - 당신은 추상적으로 방법을 표시해야합니다.
다음 식의 "다른 쪽은": 방법은 구현이 경우 다음 추상적으로 형질의 방법으로 표시 할 필요는 없다 :
abstract class IntQueue { import collection.mutable._ val q = Queue[Int]() def get(): Int = { q.dequeue() } def put(x: Int) = { q.enqueue(x) } }
추상적 인 포함 이제 불필요
trait Doubling extends IntQueue { /* Look Ma! no abstract here ! */ override def put(x: Int) { super.put(2 * x) } } defined trait Doubling
-
==============================
2.아이디어는 불완전한 재정라는 것이다 - 당신은 아직도 당신이 가상 방법의 행동 것을 수정하고, 비록 그 방법을 제공하는 형질의 결국 구체적인 구현을 필요로합니다. 즉, 당신이 무시하고있는 방법은 전체 독립 구현하지 않습니다. 그것은 파이썬에서 방법 장식의 힘과 유사한 효과를 제공합니다.
아이디어는 불완전한 재정라는 것이다 - 당신은 아직도 당신이 가상 방법의 행동 것을 수정하고, 비록 그 방법을 제공하는 형질의 결국 구체적인 구현을 필요로합니다. 즉, 당신이 무시하고있는 방법은 전체 독립 구현하지 않습니다. 그것은 파이썬에서 방법 장식의 힘과 유사한 효과를 제공합니다.
지금까지 내가 이유를 할 수있는, 형질의 방법은 경우에 그것을 호출하는 경우에만 매우 추상적 우선이지만, 그것은 구체적인 구현을 필요로 알고 메소드의 구현을 검사하는 코드의 클라이언트를 기대하는 캡슐화를 나누기. 따라서, 당신은 완전히 인터페이스를 정의하는 추상적 우선 표시해야합니다.
-
==============================
3.후반 스칼라 특성 게시물 바인딩의 일부; 아주 명확한 설명을 제공한다; 그대로 울부 짖는 소리를 (자세한 내용은 전체 게시물 읽기) 제공 :
후반 스칼라 특성 게시물 바인딩의 일부; 아주 명확한 설명을 제공한다; 그대로 울부 짖는 소리를 (자세한 내용은 전체 게시물 읽기) 제공 :
추상 기본 클래스는 requestApproval 방법의 구현을 제공했다. 가장 왼쪽 특성이 메소드를 호출하기 때문에이 좋다. 기본 클래스의 메소드가 추상 메소드의 경우 어떻게됩니까?
abstract class ApprovalRequest { def requestApproval() }
우리는이를 변경하는 경우, 우리는 컴파일러에서 오히려 이상한 메시지가 : 오류 : 클래스 ApprovalRequest의 방법 requestApproval가 액세스 할 수 있습니다 슈퍼에서. 이 멤버에 의해 무시하지 않는 한 그것은 추상적하지 않을 수 있습니다 선언 추상적이고 재정의 추상적이고 재정의 조합은 법의 최종 구현이 혼합 된 형질 클래스가 제공됩니다 컴파일러를 알려줍니다. 우리는 방법에 추상적 인 키워드를 추가하는 경우, 우리는 더 이상 ApprovalRequest의 익명의 구현을 사용할 수 없습니다. 이 객체는 추상적 인 재정의 방법 requestApproval의 구현을 찾는 것 하나가 아니므로 생성 할 수 없습니다. 대신 우리는 ApprovalRequest 및 구현 requestApproval을 확장하는 새 클래스를 만들어야합니다. 우리는 그 클래스의 인스턴스로 특성을 섞는다.
class ApprovalDelegate extends ApprovalRequest { override def requestApproval() { println("and now we play the waiting game") } } val adCampaign = new ApprovalDelegate with MarketingApprovalRequest with FinanceApprovalRequest with ExecutiveApprovalRequest
이제 출력을 줄 것이다 :
requesting approaval from executives requesting approval from Finance requesting approval from Marketing and now we play the waiting game
from https://stackoverflow.com/questions/23645172/why-is-abstract-override-required-not-override-alone-in-subtrait by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 스칼라에서 열거 순열에 코드 (0) | 2019.11.27 |
---|---|
[SCALA] 주어진 제네릭 형식 스칼라에 의해 클래스의 동반자 오브젝트를 취득 (0) | 2019.11.27 |
[SCALA] 어떻게 스칼라는 방법 정의에 여러 매개 변수를받을 수 있습니까? (0) | 2019.11.27 |
[SCALA] 어떻게 그 값에 의한 scala.collection.Map [java.lang.String의, 지능] 정렬하려면? (0) | 2019.11.27 |
[SCALA] 스칼라 :지도의 컬렉션을 병합하는 방법 (0) | 2019.11.27 |