abstract override는 트레이트에서만 가능

abstract override는 트레이트에서만 가능 (Abstract Override Only In Traits)

트레이트 밖의 멤버에 abstract override를 사용했을 때 나오는 에러예요.

출처: Scala 3 Reference

본문

트레이트 밖에 있는 멤버에 abstract override를 사용하면 이 에러가 발생해요.

abstract override 수식어는 트레이트의 멤버에만 허용돼요. 이는 그 멤버가 수퍼클래스의 구체 멤버를 오버라이드하되, 트레이트가 클래스에 섞일 때 추가 구현이 필요하다는 뜻이에요.

예시

class Base:
  def greet: String = "Hello"

class Child extends Base:
  abstract override def greet: String = super.greet + "!"

에러 메시지

-- [E064] Syntax Error: example.scala:5:24 -------------------------------------
5 |  abstract override def greet: String = super.greet + "!"
  |                        ^
  |             abstract override modifier only allowed for members of traits

해결 방법

// Use abstract override in a trait
class Base:
  def greet: String = "Hello"

trait Greeter extends Base:
  abstract override def greet: String = super.greet + "!"

class Child extends Base with Greeter
// Or use a regular override in a class
class Base:
  def greet: String = "Hello"

class Child extends Base:
  override def greet: String = super.greet + "!"

더 알아보기

  • abstract override는 트레이트 안에서 쓰고, 클래스에서는 일반 override를 쓰면 돼요.