다운캐스팅

Downcasting

클래스 기반 프로그래밍에서 다운캐스팅 또는 유형 개선은 기본 클래스의 참조를 파생된 클래스 중 하나에 캐스팅하는 행위입니다.

많은 프로그래밍 언어에서는 타입 인스펙션을 통해 참조 대상 객체의 타입이 실제로 캐스팅 대상 객체의 타입인지 또는 파생된 타입인지를 확인할 수 있으며, 그렇지 않은 경우 오류를 발생시킬 수 있습니다.

즉, 베이스 클래스(부모 클래스)의 변수가 파생 클래스(자녀 클래스)의 값을 가지는 경우, 다운캐스팅이 가능하다.

OCaml 등 일부 언어에서는 다운캐스팅을 [1]허용하지 않습니다.

예

자바

일반의 학급 과일{}  // 부모 클래스 일반의 학급 사과 확장 과일{}  // 자녀 클래스  일반의 정적인 무효 주된(스트링 args[]) {     // 다음은 암묵적인 업캐스트입니다.     과일 부모 = 신규 사과();     // 다음은 다운캐스트입니다.여기서, 변수 'parent'는 다음과 같이 동작합니다.     // Apple 인스턴스 보유:     사과 어린아이 = (사과)부모; //Apple은 자식 클래스이지만 Fruit는 부모 클래스입니다. } 

C++

// 부모 클래스: 학급 과일 {  일반의:   // 런타임 체크된 다이내믹 캐스트를 사용하려면 다형이어야 합니다.   가상 ~과일() = 체납; };  // 자식 클래스: 학급 사과 : 일반의 과일 {};  인트 주된(인트 argc, 컨스턴트 차** argv) {   // 다음은 암묵적인 업캐스트입니다.   과일* 부모 = 신규 사과();   // 다음은 다운캐스트입니다.여기서, 변수 'parent'는 다음과 같이 동작합니다.   // Apple 인스턴스 보유:   사과* 어린아이 = dynamic_cast< >사과*>(부모); } 

사용하다

다운캐스팅은 부모 변수에 의해 참조되는 값의 유형을 알고 있을 때 유용하며 값을 매개 변수로 전달할 때 자주 사용됩니다.다음 예제에서는 메서드 objectToString이 String 유형으로 가정된 Object 파라미터를 사용합니다.

일반의 정적인 스트링 objectToString(물건 myObject(myObject)) {     // 현재 myObject 값이 string일 때만 작동합니다.     돌아가다 (스트링)myObject(myObject); }  일반의 정적인 무효 주된(스트링 args[]) {     // 이것은 String을 통과했기 때문에 동작하기 때문에 myObject의 값은 String입니다.     스트링 결과 = objectToString("내 문자열");     물건 ifail(실패) = 신규 물건();     // String 값이 없는 개체를 통과했기 때문에 실패합니다.     결과 = objectToString(ifail(실패)); } 

이 방법에서는 다운캐스팅을 통해 컴파일러가 발생할 수 있는 오류를 검출하지 못하고 런타임에러가 발생합니다.myObject가 String 타입인 경우가 있기 때문에 컴파일 시에는 myObject를 String('String')으로 다운캐스트할 수 없었습니다.따라서 전달된 파라미터가 논리적인지 여부를 확인할 수 있는 것은 실행 시뿐입니다.myObject를 범용 java.lang을 사용하여 컴파일 시간 문자열로 변환할 수도 있습니다.Object.toString()은 도움이 되지 않거나 안전하지 않은 경우 기본 toString() 구현을 호출할 위험이 있으며 예외 처리로 이를 방지할 수 없습니다.

C++에서는 dynamic_cast를 통해 런타임유형 체크가 구현됩니다.컴파일 타임다운캐스팅은 static_cast에 의해 구현되지만 이 조작은 타입 체크를 실행하지 않습니다.잘못 사용하면 정의되지 않은 동작이 발생할 수 있습니다.

고려 사항.

잘못 고려된 설계의 일반적인 예로는 Java 제네릭스가 도입되기 전의 Java 컨테이너와 같은 상위 [citation needed]유형의 컨테이너가 있습니다. 이 컨테이너는 다시 사용할 수 있도록 포함된 개체를 다운캐스트해야 합니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Vouillon, Jérôme; Rémy, Didier; Garrigue, Jacques (September 12, 2013). "Objects in OCaml". The OCaml system release 4.01 : Documentation and user's manual.

외부 링크