다음과 같은 상황에서 ClassB의 변수/메소드에 액세스 할 수 있습니까? ClassB가이 InterfaceA 형을 구현인터페이스를 구현하는 클래스에서 변수에 액세스
는
InterfaceA object = new ClassB();
object.variable_from_classB
어떻게 방법에 액세스 할 수 및 클래스 B에서 varables 수 있습니까?
다음과 같은 상황에서 ClassB의 변수/메소드에 액세스 할 수 있습니까? ClassB가이 InterfaceA 형을 구현인터페이스를 구현하는 클래스에서 변수에 액세스
는
InterfaceA object = new ClassB();
object.variable_from_classB
어떻게 방법에 액세스 할 수 및 클래스 B에서 varables 수 있습니까?
일반적으로 불가능합니다. 정적 유형을 사용하는 Java와 같은 언어를 사용하면 컴파일 오류가 발생합니다. object
을 ClassB
으로 다시 캐스팅합니다.
((ClassB) object).variable_from_classB
귀하의 경우에 적용됩니다. 정적 유형 정보없이 언어를 사용하는 경우 컴파일러는 대개 변수가 액세스 될 수 있는지 또는 객체에 있는지 여부를 결정할 기회가 없습니다. 이것은 런타임에 결정됩니다.
캐스팅을 허용하는 정적 유형 언어에서 런타임 환경은 일반적으로 캐스트를 검사하고 오류가 발생하면 오류를 던집니다. 따라서 object
이 ClassB
유형이 아닌 경우 컴파일러는 위의 행에서 오류를보고하지 않습니다. 그러나 객체의 구체 유형을 ClassB
으로 캐스트 할 수 없으므로 런타임에 형 변환이 실패합니다.
위의 캐스팅만으로도 유효하지만 나쁜 습관입니다. 적어도 캐스팅의 성공 여부를 미리 확인해야합니다. instanceof
또는 귀하의 언어가 제공하는 연산자를 사용하십시오. ClassB
의 필드/메소드에 액세스해야하는 경우 InterfaceA
대신 ClassB
유형의 변수/매개 변수를 사용하는 것이 더 좋습니다.
참고 :
안녕하세요 답변에 감사드립니다 @nif. 클래스 B의 필드/메소드에 액세스해야한다면 "InterfaceA 대신 ClassB 유형의 변수/매개 변수 사용"이라고 말하면 ClassB와 같은 다른 인스턴스를 생성해야합니다. varObj = new ClassB(); varObj 통해 내 변수에 액세스 할? – Zippy
제 말은,'ClassB'에서 필요한 것들이 필요하다면 먼저 변수를'InterfaceA'라고 선언하지 마십시오. 'ClassB'가'InterfaceA'를 구현했다고해서 반드시 사용해야한다는 것은 아닙니다. – nif
아 ~, 고마워 .-) – Zippy