2013-08-09 3 views
0

나는 다음과 같은 Windows 런타임 솔루션을 설치 한 : 또한, 다른 클래스가있는 EXE는 DLL에서WinRT는 리플렉션을 사용하여 수퍼 클래스 생성자를 찾고 호출 할 수 있습니까?

public sealed class DerivedClass : BaseClass { 

} 

에서 내 EXE

public abstract class BaseClass { 

    public BaseClass(Guid id, string name) { 
     //... 
    } 

} 

참조하는 DLL에서

을하는 런타임에 지정되는 서브 유형 BaseClass을 사용합니다. 나는 기본 클래스 생성자를 가지고 있기 때문에, 내가 지금처럼 인스턴스화 할 수있을 것이라고 생각 :

//this._userType holds the type of DerivedClass 
BaseClass foo = (BaseClass)Activator.CreateInstance(this._userType, id, name); 

그러나, 생성자를 찾을 수 없음을 나에게 알려줍니다. 그래서 나는 가서 TypeGetConstructor() 메서드를 사용할 수 있다고 말한 다른 답변을 찾았지만 WinRT에는 나타나지 않습니다. DeclaredConstructors 속성이 있지만 DerivedClass에 명시 적으로 선언 된 생성자 만 나열됩니다. DerivedClass은이 특정 생성자에 대해 BaseClass 이외의 작업을 수행 할 필요가 없으므로 base을 호출하는 명시 적 생성자를 작성하는 것이 싫지만 그 유일한 옵션 인 경우 알려주십시오 (이 접근 방식을 확인했습니다. 공장).

답변

2

C# 수퍼 클래스 생성자에서 클래스는 파생 클래스에 의해 자동으로 상속되지 않습니다. 의 당신이 생성자 슈퍼 클래스가 있다고 가정 해 봅시다 : 당신은 파생 클래스에 매개 변수의 동일한 세트 생성자를 선언하지 않으면

public class BaseClass 
{ 

    public BaseClass(Guid id, string name) 
    { 
     //... 
    } 

} 

것은, 그것을 위해 사용할 수 없습니다. 당신은 그것을 사용할 수 있도록 파생 클래스 생성자에서 상위 클래스의 생성자를 호출해야합니다

public sealed class DerivedClass : BaseClass 
{ 
    public DerivedClass(Guid id, string name) 
     : base(id, name) 
    { } 
} 

또한, 파생 클래스 생성자는 항상 수퍼 클래스의 생성자를 호출 할 필요가있다. 매개 변수없는 수퍼 클래스 생성자가 있으면 자동으로 호출되기 때문에 명시 적으로 호출 할 필요가 없습니다. 그러나 암시 적으로 매개 변수없는 생성자는 매개 변수가 일치하는 생성자가 아니라 항상 호출됩니다. 다른 모든 경우에 위의 구문을 사용하여 명시 적으로 선택된 수퍼 클래스 생성자를 호출해야합니다.

또 다른 중요한 점은 추상 클래스는 추상 클래스를 직접 인스턴스화 할 수 없으므로 파생 클래스에서만 호출 할 수 있으므로 실제로는 공용 생성자가 필요하지 않습니다. 그건 당신이 정말로 그들을 protected으로 만들어야한다는 것을 의미합니다. 컴파일러는 불평하지 않지만 추상 클래스에 public 생성자가있는 경우 대부분의 스타일 검사 도구에서 경고를 표시합니다.

마지막으로 한 가지 : 절대적으로 필요하지 않는 한 실제로는 반사 사용을 피해야합니다. 이는 성능에 영향을 주며 형식 안전성을 손상시킵니다. 즉, 컴파일 타임에 대신 런타임에 오류가 발생합니다.

+0

아, 저는 public으로 생성자를 부주의하게 입력했습니다 (Activator는 public 생성자 만 선택한다는 것을 읽은 후 대중이 내 마음 속에있었습니다). C#이 암시 적으로 수퍼 클래스 생성자를 상속받지 못했다는 것을 알지 못했습니다. C#을 사용하고 너무 많은 시간을 소비했습니다. 반사가 진행되는 한 함정을 알고 있지만이 클래스는 소켓을 통한 직렬화 및 전송을 위해 설계되었으므로 내가 아는 한 즉시 다른 방법을 사용할 수는 없습니다. 모든 조언을 주셔서 감사합니다! – borrrden

관련 문제