명명 된 생성자는 Dart의 생성 생성자의 하위 집합입니까?

Suragch

에서 다트 언어 투어 생성자에 대한 그것은 생식 생성자의 예를 제공합니다 :

class Point {
  double x, y;

  Point(double x, double y) {
    // There's a better way to do this, stay tuned.
    this.x = x;
    this.y = y;
  }
}

나중에 명명 된 생성자 의 예를 제공합니다 .

class Point {
  double x, y;

  Point(this.x, this.y);

  // Named constructor
  Point.origin() {
    x = 0;
    y = 0;
  }
}

그래서 생성자가 클래스와 동일한 이름을 사용할 때 생성 생성자라고 믿게되었습니다.

Point(this.x, this.y);

그러나 추가 식별자가 있으면 명명 된 생성자입니다.

Point.origin() {
  x = 0;
  y = 0;
}

그러나 내 답변 중 다른 하나 에서 Dart 전문가가 "이름이 지정된 생성자"라는 단어를 "생성 생성자"로 변경했습니다. 그것은 내가 그들 사이의 차이점을 오해했을 수도 있다는 것을 깨달았습니다. 명명 된 생성자가 생성 생성자의 하위 집합입니까? 그렇다면 추가 식별자가 첨부되지 않은 클래스 이름 만있는 생성자를 어떻게 호출합니까?

'명명 된 생성자'라는 용어가 언어 사양 에없는 것 같습니다 .

lrn

Dart에서 생성자는 생성 생성자 또는 팩토리 생성자입니다. 그것이 말하는 경우 factory앞에, 그렇지 않으면 그것은 생식 생성자의, 공장 생성자입니다.

생성 적 생성자는 항상 자신이 속한 정확한 클래스 인스턴스를 만듭니다 . 팩토리 생성자는 (거의) 자신이 속한 클래스의 유형 인 반환 유형을 가진 정적 함수입니다. 그 하위 유형을 반환 할 수 있지만 자체적으로 새로운 객체를 생성하지는 않습니다.

생성자는 명명 되거나 명명되지 않을 수 있습니다 . 클래스의 Foo경우 명명 된 생성자 Foo는 "unnamed"(또는 실제로 "empty-named") 생성자이며 Foo.someName명명 된 생성자입니다. 생성자의 이름이 지정되었는지 여부는 생성 또는 팩토리인지 여부와 무관합니다. Dart에는 오버로딩 (동일한 범위에 동일한 이름을 가진 여러 선언, 일반적으로 인수 유형으로 구분)이 없으므로 명명 된 생성자가 없으면 클래스 당 하나의 생성자 만 가질 수 있습니다. 명명 된 생성자를 사용하면 클래스가 원하는만큼 생성자를 가질 수 있으며 각 생성자는 언어에서 허용하는 생성자의 변형이 될 수 있습니다.

생성자는 포워딩 이거나 더 나은 이름이 없는 경우 비 포워딩 일 수 있습니다. 전달 생성 생성자는 동일한 클래스의 생성 생성자로 전달해야합니다. 예:

class Point {
  final double x, y;
  const Point(this.x, this.y);  // Generative, unnamed, non-forwarding, const.
  const Point.diagonal(double xy) : this(xy, xy); // Generative, named, forwarding, const.
}

전달 팩토리 생성자는 매개 변수를 다른 생성자로 전달합니다. 예:

abstract class Point {
  double get x;
  double get y;
  const factory Point(this.x, this.y) = _Point;  // Factory, unnamed, forwarding, const.
}
class _Point implements Point {
  final double x, y;
  const _Point(this.x, this.y); // Generative, unnamed, non-forwarding, const.
}

두 종류의 전달 생성자, 생성 및 팩토리는 실제로 관련이 없습니다. 그들은 매우 다른 방식으로 작동하지만 둘 다 객체를 다른 생성자에게 반환하는 작업을 위임하며 본문을 가질 수 없습니다. 다시 말하지만, 명명되는 것은이 모든 것과 독립적입니다.

마지막으로 생성자가 될 수도 있고 const아닐 수도 있습니다 . const 생성 생성자는 다른 const 생성 생성자에 전달되고 : this(...)인수는 잠재적으로 상수 표현식이거나 전달되지 않아야하며 모든 이니셜 라이저 표현식은 잠재적으로 상수 표현식이어야하며 본문이있을 수 없습니다. const 팩토리 생성자 다른 const 생성자 (팩토리 또는 생성)로 전달 되어야합니다 . Const 생성자는 본문을 가질 수 없으며 전달되지 않는 팩토리 생성자에는 본문이 있어야합니다.

이러한 모든 다른 생성자 중에서 전달되지 않는 생성 생성자 만이 실제로 새 객체 자체를 만들 수 있습니다. 그것이 실제 행동이 일어나는 곳입니다. 이것이 가장 기본적인 생성자이며 다음과 같이 보일 수 있습니다.

  Foo.bar(this.value, int otherValue) : _otherValue = otherValue, super.bar(42) {
    this.doSomething();
  }

리디렉션되지 않는 팩토리 생성자는 초기화 형식 (양식의 매개 변수)을 사용할 수있는 유일한 장소 this.value입니다. 이니셜 라이저 목록은 동일한 클래스에서 선언 된 인스턴스 변수를 초기화 할 수 있지만,없는 경우 분명히 비어있을 수 있습니다. 끝의 수퍼 호출은 수퍼 클래스의 생성 생성자를 호출해야하지만 super()생략하면 기본값으로 설정 됩니다. 본문은 새 개체를 사용할 수있게되는 첫 번째 위치 ( this)이지만 본문 ;이 비어 있으면 생략 (으로 대체 ) 할 수 있습니다 . 이것이 가장 간단한 생성자가 Foo();( 다른 생성자를 선언하지 않으면 얻는 기본 생성자 이기도 한) 이유 입니다.

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

dart의 json 매핑을위한 팩토리 및 명명 된 생성자

분류에서Dev

":"로 명명 된 생성자

분류에서Dev

복사 생성자로 생성 된 객체의 수명

분류에서Dev

명시 적으로 정의 된 생성자가 없는데 왜 객체를 생성 할 수 있습니까?

분류에서Dev

Dart 명명 된 생성자, 정적 메서드 및 팩토리 생성자

분류에서Dev

`mknod`에 의해 생성 된 명명 된 파이프와`mkfifo`에 의해 생성 된 FIFO가 동등합니까?

분류에서Dev

Java에서 자체 서명 된 인증서 생성을위한 CertandKeygen의 대안

분류에서Dev

하위 클래스의 생성자 서명을 부모의 생성자 서명과 다르게 만들 수 있습니까?

분류에서Dev

증명 생성자는 Coq의 부분 함수입니다.

분류에서Dev

명명 된 매개 변수 생성자에서 정의되지 않은 전달을 방지하는 방법이 있습니까?

분류에서Dev

Swift 생성자가 명명 된 매개 변수 호출을 사용하는 이유는 무엇입니까?

분류에서Dev

tsyringe-과부하 된 생성자로 의존성 주입

분류에서Dev

sed는 생성되는 명령 줄의 일부가 될 숫자를 추출하는 방법입니까?

분류에서Dev

자동 생성 된 파일 설명자가 3부터 시작하는 이유는 무엇입니까?

분류에서Dev

JavaScript-명명 된 생성자 사용

분류에서Dev

Azure의 Certenroll-자체 서명 된 인증서 생성

분류에서Dev

파일 생성시 타임 스탬프가 포함 된 로그 파일을 생성하는 WinSCP의 사용자 지정 명령

분류에서Dev

Laravel의 스키마에서 서명 된 증분을 생성하는 방법은 무엇입니까?

분류에서Dev

`dotnet publish` 명령의 결과로 생성 된 "MCD"구성은 무엇입니까?

분류에서Dev

컴파일러가 명시 적으로 정의 된 이동 생성자를 무시합니까?

분류에서Dev

명령에 의해 생성 된 (재귀 적으로) 총 하위 프로세스 수를 계산합니다.

분류에서Dev

무작위로 생성 된 배열에서 숫자의 합계

분류에서Dev

생성자 서명 생성

분류에서Dev

자동 생성 된 DataGrid 열의 정렬 가능성은 무작위입니다.

분류에서Dev

dart에서 특정 명명 된 생성자로만 생성 된 객체를 저장할 변수를 선언합니다.

분류에서Dev

Haskell의 데이터 생성자 설명

분류에서Dev

socketIO에 의해 생성 된 ID가 자동 생성되는 경우 두 사용자 간의 통신을 설정하는 방법은 무엇입니까?

분류에서Dev

이전 alloctaor :: construct와 새로운 생성자와 명시 적 생성자의 차이점은 무엇입니까?

분류에서Dev

명명 된 경로 매개 변수 재정의 편집 및 생성

Related 관련 기사

  1. 1

    dart의 json 매핑을위한 팩토리 및 명명 된 생성자

  2. 2

    ":"로 명명 된 생성자

  3. 3

    복사 생성자로 생성 된 객체의 수명

  4. 4

    명시 적으로 정의 된 생성자가 없는데 왜 객체를 생성 할 수 있습니까?

  5. 5

    Dart 명명 된 생성자, 정적 메서드 및 팩토리 생성자

  6. 6

    `mknod`에 의해 생성 된 명명 된 파이프와`mkfifo`에 의해 생성 된 FIFO가 동등합니까?

  7. 7

    Java에서 자체 서명 된 인증서 생성을위한 CertandKeygen의 대안

  8. 8

    하위 클래스의 생성자 서명을 부모의 생성자 서명과 다르게 만들 수 있습니까?

  9. 9

    증명 생성자는 Coq의 부분 함수입니다.

  10. 10

    명명 된 매개 변수 생성자에서 정의되지 않은 전달을 방지하는 방법이 있습니까?

  11. 11

    Swift 생성자가 명명 된 매개 변수 호출을 사용하는 이유는 무엇입니까?

  12. 12

    tsyringe-과부하 된 생성자로 의존성 주입

  13. 13

    sed는 생성되는 명령 줄의 일부가 될 숫자를 추출하는 방법입니까?

  14. 14

    자동 생성 된 파일 설명자가 3부터 시작하는 이유는 무엇입니까?

  15. 15

    JavaScript-명명 된 생성자 사용

  16. 16

    Azure의 Certenroll-자체 서명 된 인증서 생성

  17. 17

    파일 생성시 타임 스탬프가 포함 된 로그 파일을 생성하는 WinSCP의 사용자 지정 명령

  18. 18

    Laravel의 스키마에서 서명 된 증분을 생성하는 방법은 무엇입니까?

  19. 19

    `dotnet publish` 명령의 결과로 생성 된 "MCD"구성은 무엇입니까?

  20. 20

    컴파일러가 명시 적으로 정의 된 이동 생성자를 무시합니까?

  21. 21

    명령에 의해 생성 된 (재귀 적으로) 총 하위 프로세스 수를 계산합니다.

  22. 22

    무작위로 생성 된 배열에서 숫자의 합계

  23. 23

    생성자 서명 생성

  24. 24

    자동 생성 된 DataGrid 열의 정렬 가능성은 무작위입니다.

  25. 25

    dart에서 특정 명명 된 생성자로만 생성 된 객체를 저장할 변수를 선언합니다.

  26. 26

    Haskell의 데이터 생성자 설명

  27. 27

    socketIO에 의해 생성 된 ID가 자동 생성되는 경우 두 사용자 간의 통신을 설정하는 방법은 무엇입니까?

  28. 28

    이전 alloctaor :: construct와 새로운 생성자와 명시 적 생성자의 차이점은 무엇입니까?

  29. 29

    명명 된 경로 매개 변수 재정의 편집 및 생성

뜨겁다태그

보관