계승 중 구축기의 호출 순서

2649 단어 빌더 순서
기초 클래스에 사용되는 구축기는 하나의 파생 클래스의 구축기에서 호출되고 점차적으로 위로 연결되어 모든 기초 클래스가 사용하는 구축기가 호출될 수 있도록 한다.이렇게 하는 이유는 구축기가 대상이 정확하게 구축되었는지 확인하는 특수한 임무를 띠기 때문이다.
다음은 구축 순서에 따라 합성, 계승, 다형성의 효과를 보여주는 예이다.
class Meal 
{
  Meal() { System.out.println("Meal()"); }
}
class Bread 
{
  Bread() { System.out.println("Bread()"); }
}
class Cheese
 {
  Cheese() { System.out.println("Cheese()"); }
}
class Lettuce
{
  Lettuce() { System.out.println("Lettuce()"); }
}
class Lunch extends Meal
 {
  Lunch() { System.out.println("Lunch()");}
}
class PortableLunch extends Lunch 
{
  PortableLunch() {
  System.out.println("PortableLunch()");
  }
}
class Sandwich extends PortableLunch 
{
  Bread b = new Bread();
  Cheese c = new Cheese();
  Lettuce l = new Lettuce();
  Sandwich() {
    System.out.println("Sandwich()");
  }
  public static void main(String[] args) {
    new Sandwich();
  }
}

출력 결과는 다음과 같습니다.
Meal()
Lunch()
PortableLunch()
Bread()
Cheese()
Lettuce()
Sandwich()
즉, 복잡한 객체에 대한 빌더 호출은 다음 순서를 따릅니다.
(1) 기본 클래스 구축기를 호출한다.이 단계는 끊임없이 반복될 것이다. 먼저 구축된 것은 등급별 구조의 뿌리이다.
다음은 다음 파생류 등등이다.가장 깊은 층에 도달할 때까지 파생류.
(2) 성명 순서에 따라 구성원 초기화 모듈을 호출한다.
(3) 파생 구축기의 주체를 호출한다.
구축기 내부의 다형적 방법의 행위
구축기는 현재 클래스를 구축해야 하는가 파생 클래스를 구축해야 하는가가 문제다.
예:
abstract class Glyph
 {
  abstract void draw();
  Glyph() {
  System.out.println("Glyph() before draw()");
  draw();
  System.out.println("Glyph() after draw()");
  }
}
class RoundGlyph extends Glyph 
{
  int radius = 1;
  RoundGlyph(int r) {
  radius = r;
  System.out.println(
  "RoundGlyph.RoundGlyph(), radius = "+ radius);
  }
  void draw() {
  System.out.println("RoundGlyph.draw(), radius = " + radius);
  }
}
public class PolyConstructors 
{
  public static void main(String[] args) {
    new RoundGlyph(5);
  }
}

결과 출력:
Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5
위의 부분의 초기화 순서는 결코 완전하지 않은데, 그것은 문제를 해결하는 관건이다.초기화의 실제 과정은 다음과 같습니다.
(1) 다른 어떤 조작을 취하기 전에 대상에게 분배된 저장 공간을 이진 0으로 초기화한다.
(2) 앞에서 말한 것처럼 기초 클래스 구축기를 호출한다.덮어쓴 draw () 방법이 호출됩니다.
확실히 RoundGlyph 구축기가 호출되기 전에,radius의 값이 0인 것을 발견할 수 있습니다. 이것은 단계 (1)
조성했어
(3) 원래 성명한 순서에 따라 구성원 초기화 코드를 호출한다.
(4) 파생 클래스 구축기의 주체를 호출한다.
따라서 구축기를 설계할 때 가장 효과적인 규칙은 가능한 한 간단한 방법으로 대상을 준비된 상태로 진입시키는 것이다.가능하다면, 어떤 방법도 사용하지 마세요.구축기 내에서 유일하게 안전하게 호출할 수 있는 것은 기초 클래스에서final 속성을 가진 방법(private 방법에도 적용되며 자동적으로final 속성을 가진다)이다.이러한 방법은 덮어쓸 수 없기 때문에 상술한 잠재적인 문제가 발생하지 않을 것이다.

좋은 웹페이지 즐겨찾기