2010-06-18 4 views
4

다음 코드를 보았습니다 만 생성자 선언에서 기본 클래스 파생을 이해할 수 없습니다. 이것은 무엇이며 서수 방법과 함께 이것이 가능합니까?생성자에서 상속 사용 (publix X() : y)

public SplashAppContext(Form mainForm, Form splashForm) : base(splashForm) 
{ 
this.mainForm = mainForm; 
splashTimer.Tick += new EventHandler(SplashTimeUp); 
splashTimer.Interval = 2000; 
splashTimer.Enabled = true; 
} 

답변

8

그것은 그것에 유형 Form의 인수 splashForm을 통과, 기본 클래스의 생성자를 호출합니다.

기본 클래스 메소드도 호출 할 수 있습니다. 예를 들어 약간 수정하려는 동작을 재정의 한 경우 수정을 수행하고 base.TheMethod()이라는 기본 클래스 메서드를 호출합니다. 이 모양은 다음과 같습니다.

public override void FireMissiles() 
{ 
    PrimeMissiles(); 

    base.FireMissiles(); 
} 

기본 클래스 생성자와 기본 클래스 메서드를 호출하는 구문은 알 수있는 것과 다릅니다.

4

나열된 구문은이 생성자가이 객체의 나머지 구성을 계속하기 전에 splashForm 매개 변수를 사용하여 수퍼 클래스의 생성자를 호출한다는 것을 의미합니다. 부모 생성자를 호출하고 여기에 splashForm을 통과

public SplashAppContext(Form mainForm, Form splashForm) 
{ ... } 

public SplashAppContext(Form mainForm, Form splashForm) : base() 
{ ... } 
2
: base(splashForm) 

하는 것과 같습니다 슈퍼 클래스 생성자가 나열되지 않은 경우, 인수 없음의 생성자는 즉, 가정한다.

1

이 구문은 SplashAppContext의 생성자를 호출하기 전에 SplashForm을 매개 변수로 전달하여 기본 생성자를 호출해야한다는 사실을 실제로 상속하지 않습니다.

이 무엇
4

...

이 줄은 constructor initializer라고합니다. 이것은 "기본 클래스의 생성자를 매개 변수 splashForm으로 호출 한 다음이 생성자의 본문을 시작합니다"를 의미합니다.

생성자에 대해 명시 적으로 생성자 이니셜 라이저가 지정되지 않은 경우 매개 변수가없는 생성자 base()이 필요하다고 가정합니다.

... 이것은 일반적인 방법으로 가능합니까?

일반 메서드의 경우 기본 클래스 메서드 (base.SomeMethod(...))를 호출 할 수 있지만 사용할 수있는 "이니셜 라이저"스타일은 없습니다.

1

바로 위 부모 클래스의 생성자를 호출하는 구문입니다. 이것은 VB.NET이 MyBase.New(splashForm)을 생성자의 첫 번째 코드 줄로 호출해야하는 반면 C# 구문입니다.

이것은 부모 개체가 자식 생성자 코드가 실행되기 시작할 때까지 완전히 구성되고 초기화되어야하기 때문에 이렇게 표현됩니다. 이 때문에 두 컴파일러 (VB.NET 및 C#)에서는 부모 생성자가 호출되기 전에 사용자 코드를 실행하지 않도록 지정합니다. 부모 생성자를 지정하지 않고 매개 변수없는 생성자가 있으면 자동으로 호출됩니다.

이 구문은 코드에서 base.FunctionName()을 호출하여 다른 함수의 기본 구현을 호출 할 수 있으므로 다른 메서드 호출에는 사용할 수 없으며 필요하지도 않습니다. 생성자는 다른 코드보다 먼저 실행해야하기 때문에 특별한 경우 일뿐입니다.

관련 문제