2012-10-10 6 views
0

는이 코드가 변경할 수 있습니다 : 나는 경우에 객체를 선언하려면, functionA에서스칼라 : 개체로 abtract 수업을 때 선언 정상 클래스의 예를 들어

abstract class A { 
    def functionA() { 
    val a : A = null; // take null just for temporary, because I cannot think what should to put here 
    a.functionB 
    } 

    def functionB() { 
     print("hello") 
    } 
} 

class C extends A{ 
} 

object Main extends App { 
    val c : C = new C() 
    c.functionB // print hello 
    c.functionA // ERROR 
} 

을 : 현재 클래스가 C

val a : A = new A // because A is abstract 

자바에서 내가 쉽게 할 수 있지만, 나는 스칼라에서 그렇게 할 수 없다 : 현재 클래스 D의 경우는,이 ​​타입 C.이있을 것이다하는 것 유형 D. 나는 할 수 없기 때문에. 제발 도와주세요.

감사합니다 :)

+3

Java에서 어떻게합니까? –

+1

그것은 당신이 채택하고있는 약간의 얽힌 논리입니다. 디자인 재검토의 확실한 표시. –

답변

1

나는 경우에 객체를 선언합니다 : 현재 클래스 C, 의지 경우 현재의 클래스 D 인 경우, 유형 C를, A는 D 타입

있을 것이다있다

내가 올바르게 이해하면 일반 상속 다형성에 대해 이야기하고 있습니다. 당신은 당신의 경우 this 참조 값 a에를 할당하거나 직접 사용할 수 있습니다

abstract class A { 
    def functionA { 
    this.functionB 
    } 

    def functionB { 
    print("hello") 
    } 
} 

class C extends A{ 
} 

object Main extends App { 
    val c : C = new C() 
    c.functionB 
    c.functionA 
} 

을이 경우에는 NullPointerException가 없을 것입니다. 당신이 정말로 진짜 형 내부 기본 클래스의 새로운 개체를 만들려면

그러나 내가이 whan @brunoconde 제안보다 다소 간단하다 생각하지만, 아이디어가 매우입니다 (다른 방법으로 상속 다형성을 사용한다 비슷한, 제네릭 정말 여기에 필요하지 않습니다 생각 :)

abstract class A { 
    def functionA { 
    val a : A = create() 
    a.functionB 
    } 

    def functionB { 
    print("hello") 
    } 

    def create(): A 
} 

class C extends A { 
    override def create() = new C 
} 

이것은 자바에서 내가해야 할 일이다. 모든 자식 클래스에서 create() 메서드를 재정의해야합니다. 내가 반영하지 않고 무시하지 않고 이것을 할 수있는 것은 의심 스럽다.