인터페이스로 객체 다운 캐스팅

Bluefarmer

간단히 말해, 특정 인터페이스를 구현하지 않는 수퍼 클래스로 클래스 인스턴스를 그룹화 할 수 있기를 바랍니다. 그러나 인스턴스 집합에서 해당 인터페이스를 구현하는 인스턴스의 인터페이스에서 메서드를 호출하고 싶습니다.

그것을 설명 할 수있는 몇 가지 예제 코드.

class Building{
  String c = "white"; 
  Building(){
  }

  void printColor(){
    println("The building is " + c);
  }

  void paint( String c ){
   this.c = c;  
  }

  void printBuildQuality(){
   println("The build quality is average"); 
  }
}


class SturdyFactoryBuilding extends Building implements Factory{

 SturdyFactoryBuilding(){
  super(); 
 }

 void printBuildQuality(){
  println("The build quality is sturdy"); 
 }

 void printFactoryOutput(){
  println("This factory makes stuff"); 
 }
}

class ShakyFactoryBuilding extends Building implements Factory{

  ShakyFactoryBuilding(){
   super(); 
  }

  void printBuildQuality(){
   println("The build quality is shaky");
  }

  void printFactoryOutput(){
   println("This factory makes slightly different stuff"); 
  }
}


public interface Factory{

  public void printFactoryOutput();

}

 Building building = new SturdyFactoryBuilding();    
 building.printBuildQuality();
 building.printColor();
 building.paint("bright red");
 building.printColor();
 building.printFactoryOutput();  

수퍼 클래스에 'isFactory'플래그를 사용하여 이것을 달성 할 수있는 방법이 있습니까?

감사.

Fildor

나는 당신이 트레이드 오프를해야한다고 생각한다 : 당신은 약간의 안티 패턴을 받아들이거나 당신이 Building"인터페이스"를 열어 어댑터 역할을한다.

class Building implements Factory{

    // the other building stuff

    @Override
    public void printFactoryOutput(){ /* NO OP */ }
}

그런 다음 호출 할 수 있습니다 printFactoryOutput모두에 Building이 시점에 아무런 영향까지이없는 S.

당신 때문에 Factory-implementations는 확장 BuildingNOOP-구현을 상속 자동으로합니다. 그러나 재정의하기 때문에 :

class ShakyFactoryBuilding extends Building implements Factory{

  ShakyFactoryBuilding(){
   super(); 
  }

  @Override
  public void printBuildQuality(){
   println("The build quality is shaky");
  }

  @Override
  public void printFactoryOutput(){
   println("This factory makes slightly different stuff"); 
  }
}

... 원하는 결과를 얻었습니다.

단점은 물론 모든 건물에 printFactoryOutput가시성 이 있다는 것 입니다. 하지만 그것이 제가 말한 트레이드 오프입니다. 이것이 허용되지 않는 경우 디자인을 완전히 재고해야합니다.

Factory 아닌 Building이 해당 Method에서 호출되지 않음을 명확히하기 위해 Building 에서 UnsupportedOperationException을 발생시킬 수 있지만 코드의 모든 곳에서 try / catch 블록을 강제 실행합니다. 부울을 반환 할 수도 있습니다. default = false이고 실제로 공장이라면 true를 반환합니다. 가능성이 많습니다.

상속보다 구성 을 사용하도록 디자인을 변경할 수도 있습니다 .

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

유형을 상속하는 객체 목록을 새로운 인터페이스 유형 목록으로 캐스팅

분류에서Dev

객체를 업 캐스팅 및 다운 캐스팅하는 동안 잘못된 초기화 오류

분류에서Dev

다운 캐스트 된 객체를 프로토 버퍼로 다시 업 캐스팅

분류에서Dev

URLClassLoader로 생성 된 객체를 인터페이스 유형으로 캐스팅

분류에서Dev

Swift : NSObject를 다른 유형의 UI 객체로 캐스팅

분류에서Dev

COM 개체를 인터페이스로 강제 캐스팅

분류에서Dev

인터페이스 제네릭의 개체로 C # 캐스팅

분류에서Dev

CRTP 및 다운 캐스팅

분류에서Dev

Typescript 객체 클래스 멤버는 인터페이스로 정의됩니다.

분류에서Dev

null을 객체 배열로 캐스팅하는 것이 객체로 캐스팅하는 것보다 비용이 많이 듭니까?

분류에서Dev

다운 캐스팅 포인터

분류에서Dev

유형 사양 연산자는 객체 지향 언어의 다운 캐스팅과 같습니다.

분류에서Dev

인터페이스 인스턴스의 객체를 다른 인터페이스 인스턴스에 할당

분류에서Dev

Linq 표현식에서 일반 인터페이스 유형으로 객체 캐스팅

분류에서Dev

PHP는 그 값에 따라 적절한 데이터 유형으로 객체를 캐스팅합니다.

분류에서Dev

유형 캐스팅 된 객체를 업데이트하면 유형 캐스팅되지 않은 객체가 업데이트됩니다.

분류에서Dev

JSON 객체 캐스팅 문제

분류에서Dev

일반 유형 객체 캐스팅

분류에서Dev

PHP에서 배열 인덱스로`/`를 사용한 다음 객체로 캐스팅

분류에서Dev

'System .__ ComObject'유형의 COM 개체를 'Microsoft.Office.Interop.Excel.Worksheets'인터페이스 유형으로 캐스팅 할 수 없습니다.

분류에서Dev

일반 인터페이스 다형성 캐스팅 오류

분류에서Dev

다형성 대 다운 캐스팅

분류에서Dev

List 객체를 새 객체로 캐스팅 List 확장

분류에서Dev

객체를베이스의 하위 집합으로 캐스팅

분류에서Dev

Swift : 객체를 다른 객체로 타입 캐스트

분류에서Dev

C ++에서 다운 캐스팅 문제

분류에서Dev

다운 캐스팅 안전성

분류에서Dev

iOS Swift : AnyObject 다운 캐스팅

분류에서Dev

C ++에서 상속 다운 캐스팅

Related 관련 기사

  1. 1

    유형을 상속하는 객체 목록을 새로운 인터페이스 유형 목록으로 캐스팅

  2. 2

    객체를 업 캐스팅 및 다운 캐스팅하는 동안 잘못된 초기화 오류

  3. 3

    다운 캐스트 된 객체를 프로토 버퍼로 다시 업 캐스팅

  4. 4

    URLClassLoader로 생성 된 객체를 인터페이스 유형으로 캐스팅

  5. 5

    Swift : NSObject를 다른 유형의 UI 객체로 캐스팅

  6. 6

    COM 개체를 인터페이스로 강제 캐스팅

  7. 7

    인터페이스 제네릭의 개체로 C # 캐스팅

  8. 8

    CRTP 및 다운 캐스팅

  9. 9

    Typescript 객체 클래스 멤버는 인터페이스로 정의됩니다.

  10. 10

    null을 객체 배열로 캐스팅하는 것이 객체로 캐스팅하는 것보다 비용이 많이 듭니까?

  11. 11

    다운 캐스팅 포인터

  12. 12

    유형 사양 연산자는 객체 지향 언어의 다운 캐스팅과 같습니다.

  13. 13

    인터페이스 인스턴스의 객체를 다른 인터페이스 인스턴스에 할당

  14. 14

    Linq 표현식에서 일반 인터페이스 유형으로 객체 캐스팅

  15. 15

    PHP는 그 값에 따라 적절한 데이터 유형으로 객체를 캐스팅합니다.

  16. 16

    유형 캐스팅 된 객체를 업데이트하면 유형 캐스팅되지 않은 객체가 업데이트됩니다.

  17. 17

    JSON 객체 캐스팅 문제

  18. 18

    일반 유형 객체 캐스팅

  19. 19

    PHP에서 배열 인덱스로`/`를 사용한 다음 객체로 캐스팅

  20. 20

    'System .__ ComObject'유형의 COM 개체를 'Microsoft.Office.Interop.Excel.Worksheets'인터페이스 유형으로 캐스팅 할 수 없습니다.

  21. 21

    일반 인터페이스 다형성 캐스팅 오류

  22. 22

    다형성 대 다운 캐스팅

  23. 23

    List 객체를 새 객체로 캐스팅 List 확장

  24. 24

    객체를베이스의 하위 집합으로 캐스팅

  25. 25

    Swift : 객체를 다른 객체로 타입 캐스트

  26. 26

    C ++에서 다운 캐스팅 문제

  27. 27

    다운 캐스팅 안전성

  28. 28

    iOS Swift : AnyObject 다운 캐스팅

  29. 29

    C ++에서 상속 다운 캐스팅

뜨겁다태그

보관