2011-03-16 5 views

답변

14

A의 기본 생성자가 private이기 때문에 protected A() {}을 생성자로 사용하십시오. 그 B에 액세스 할 수없는 또는 디폴트 생성자가없는 경우

클래스 B가 자동으로 A의 기본 생성자를 호출 B이 올바르게 인스턴스화 할 수 없습니다 (당신은 생성자 protected A(string s) {}이있는 경우).

컴파일러는 자동으로 base()A의 기본 생성자에 대한 실제 호출입니다 B

public B() : base() 
{ 
} 

에서 다음과 같은 기본 생성자를 생성합니다.

+0

그러나 전체적인 이야기는 아닙니다. B가 추상 클래스 인 경우에도 동일한 컴파일 오류가 발생합니다. 추상 클래스에는 생성자가 없지만 B에서 파생 된 클래스 C가 동일한 문제를 가지므로 컴파일러는 여전히 규칙을 적용합니다. (C에서 파생 된 클래스가없는 경우에도 마찬가지입니다.) – yoyo

0

왜냐하면 A의 생성자는 private이지만 B의 생성자는 public이기 때문입니다. B (A를 구성하는)를 구성하면 A의 개인 생성자에 액세스 할 수있는 방법이 없습니다.

+3

B의 생성자가 공개적으로 무엇을해야합니까? –

+0

개인 생성자로 B를 인스턴스화하는 방법은 무엇입니까? 방금 B가 인스턴스화 될 수 있다고 지적했습니다 – Robert

+0

B의 개인 생성자 (B의 public 또는 protected 생성자를 호출해야 함)를 호출하는 B에 정적 팩토리 메소드를 사용할 수 있습니다. –

4

(컴파일러에 의해 추가되는) 클래스 B에 생성자 그것만 A 내에서 호출 될 수 있음을 의미하지만 기본 생성자 private으로 표시된 A의 기본 (인자없는) 생성자를 호출 할 필요 그러므로 오류. B가 동일한 어셈블리에있는 경우

protected 또는 public, 또는 internalA에 생성자를 변경

.

2

A의 생성자는 private이므로 외부에서 액세스 할 수 없습니다. 외부에서 A의 인스턴스를 생성하려면 생성자를 public 또는 protected로 만듭니다.

1

private A()에서 public A()으로 변경하십시오.

관련 문제