복붙노트

[SCALA] 왜 "추상적 오버라이드 (override)는"혼자 subtrait에서 "재정의"를하지 필요합니까?

SCALA

왜 "추상적 오버라이드 (override)는"혼자 subtrait에서 "재정의"를하지 필요합니까?

나는 추상적 인 무시가 도입 스칼라 프로그래밍의 섹션을 읽을 수 있지만 나는 아직도 정확하게 이러한 수정의 결합에 의해 표시되는 것을 혼동하고있다. 사용이 수식은 아래에 붙여있는 코드의 조각 :

trait Doubling extends IntQueue {
    abstract override def put(x: Int) { super.put(2 * x) }
}

특히,이 경우 추상의 목적을 혼동하고, 왜 우리는 단순히 재정의 키워드로 예상 결과를 얻을 수 없습니다. 우리는 슈퍼에 대한 호출을 포함하지 않은 경우, 우리는 키워드 추상적를 필요? 그 이유는 무엇? 이 스택 특성에 관한 나는이 키워드 콤보에 대한 자세한 설명을 찾고 있어요.

해결법

  1. ==============================

    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. ==============================

    2.아이디어는 불완전한 재정라는 것이다 - 당신은 아직도 당신이 가상 방법의 행동 것을 수정하고, 비록 그 방법을 제공하는 형질의 결국 구체적인 구현을 필요로합니다. 즉, 당신이 무시하고있는 방법은 전체 독립 구현하지 않습니다. 그것은 파이썬에서 방법 장식의 힘과 유사한 효과를 제공합니다.

    아이디어는 불완전한 재정라는 것이다 - 당신은 아직도 당신이 가상 방법의 행동 것을 수정하고, 비록 그 방법을 제공하는 형질의 결국 구체적인 구현을 필요로합니다. 즉, 당신이 무시하고있는 방법은 전체 독립 구현하지 않습니다. 그것은 파이썬에서 방법 장식의 힘과 유사한 효과를 제공합니다.

    지금까지 내가 이유를 할 수있는, 형질의 방법은 경우에 그것을 호출하는 경우에만 매우 추상적 우선이지만, 그것은 구체적인 구현을 필요로 알고 메소드의 구현을 검사하는 코드의 클라이언트를 기대하는 캡슐화를 나누기. 따라서, 당신은 완전히 인터페이스를 정의하는 추상적 우선 표시해야합니다.

  3. ==============================

    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
    
  4. from https://stackoverflow.com/questions/23645172/why-is-abstract-override-required-not-override-alone-in-subtrait by cc-by-sa and MIT license