2016-11-03 4 views
3

저는 상속을 가장 효과적으로 구성하는 방법에 대해 약간의 조언을 한 후에 있습니다. 나는 대부분을 사용해야하는 클래스 (아래), 그리고 기본 ExportData 클래스의 일부 클래스 오버라이드 (override)하는 :기본 클래스 생성자를 호출하지 않는 방법

public class ExtendedExportData : ExportData 
{ 

    private tData _Data; 
    private ResStrings _diaStrings; 

    public ExtendedExportData(tData Data, ResStrings diaStrings) 
     : base(tData, diaStrings) 
    { 
     _tData = Data; 
     _diaStrings = diaStrings; 

    } 
} 

이 경우 neccesary없는 무엇으로 기본 생성자를 호출 할 필요가있다 위의 클래스에서 사용 된 기본 클래스 메서드 중 어느 것도 초기화를 필요로하지 않으므로 다른 (자세한) 용도로 직접 기본 클래스의 인스턴스를 만들 때만 생성자가 필요합니다.

기본 생성자를 제거하면 하위 생성자에서 기본 생성자가 0 인수를 사용하지 않는다는 오류가 발생합니다. 어떻게 이것을 피할 수 있습니까? 사전에

public class ExportData 
{ 
    private tData _Data; 
    private ResStrings _diaStrings; 

    public ExportLines(tData Data, ResStrings diaStrings) 
    { 
     _Data = Data; 
     _diaStrings = diaStrings; 
    } 
} 

감사 :

다음은 기본 클래스입니다. 단지 생성자 base()

public ExtendedExportData(tData Data, ResStrings diaStrings) 
    : base() 
+2

기본 클래스를 보여주십시오 'ExportData' 그냥 * * 기본 클래스의 인스턴스를 인스턴스화 않습니다 그것에 –

+2

코드를 기본 생성자를 추가합니다. 이것이 상속이 의미하는 것입니다.'ExtendedExportData'*는'ExportData'의 인스턴스입니다. 만약'ExportData'가'ExtendedExportData'에 대해 의미가없는 필드를 가지고 있다면 당신은 디자인 버그가 있습니다 –

+1

ExportData 클래스에서 빈 protected 생성자를 생성 한 다음 ExtendedExportData (: base())에서 호출 할 수 있습니다. – Evk

답변

6

를 호출하여 예

public ExportData() 
{ 
    //Initialising here 
} 

그리고 다음을 :

+0

그건 잘 정렬, 나는 매개 변수가없는 생성자가 자동으로 만들어 졌는지 알지 못했습니다. 지금 많이 설명합니다 :) 보호 된 매개 변수없는 생성자를 기본 클래스에 추가 했으므로 이제는 모두 정상입니다. –

1

당신은 항상 수행하는 기본 클래스의 매개 변수없는 생성자를 가질 수있는 모든이, 즉 필요가 초기화하는 의 기본 클래스가 항상 사용되지만 기본 클래스에 명시 적으로 정의 된 생성자가 없으면 C#은 매개 변수없는 생성자를 자동으로 생성합니다.

마찬가지로 파생 클래스에서 : base(...)을 명시 적으로 언급하지 않으면 C#에서는 기본 클래스의 매개 변수없는 생성자를 사용한다고 가정합니다.

생성자를 정의하자마자 매개 변수없는 생성자가 더 이상 자동으로 생성되지 않으므로 에 을 호출하면이됩니다. ,이 생성자를 사용할 수 있습니다 ExportData에서 상속 클래스 만 보호이 생성자를함으로써

public class ExportData 
{ 
    protected ExportData() 
    { 
    } 
} 

, 그들은 더 이상 없다 :

는 쉽게 기본 클래스에 같은 생성자를 추가하여 변경할 수 있습니다 : base(...)을 포함하십시오.

+0

고마워, 당신은 대부분 정확하다고 보이지만 추가 테스트 후 나는 상속 클래스에서 base()를 호출 할 필요가없는 기본 클래스의 매개 변수없는 생성자를 찾았습니다. –

+0

@DanHall @DanHall 당신이 받아 들였고 그에 따라 upvoted 그에 따라 그에 따라 그러나 내 것으로 보는 것은 또한 더 정확하게 명시 적입니다. – TheLethalCoder

+0

안녕하세요, 선명도에 대한 약간의 과잉 공격 코드가 잘못되어서 감사합니다. 받아 들인 대답. –

1

ExportData 클래스에 빈 생성자 (public ExportData(){})를 만들지 않았습니까?

그렇지 않으면 here과 같은 작업을 수행 할 수 있습니다.

+0

그 트릭을 멋지게, 그냥 보호 된 생성자로 추가하고 그것을 비워두고, 상속 될 때 사용하십시오. 감사. –

0

오류는 기본 클래스가 항상 인스턴스화되어야하고 기본 클래스에 기본 생성자가 없기 때문입니다.

기본 클래스에서 필요하지 않은 기본 클래스의 기능을 사용하는 경우 상속 아키텍처를 검토하십시오.

0

나는 이것이 오래된 질문이지만 미래의 유사한 문제 해결자를 위해 나는 다른 것을 쓸 것이라고 생각한다.

내가이 질문에 적절하게 동의하면 더 우아하고 일반적인 해결책이 있습니다.기본 클래스를 추상화하십시오. 상속 도중 기본 생성자를 호출 할 수 있습니다.

더 많은 정보는 여기에서 찾을 수 있습니다 :

Constructor of an abstract class in C#

관련 문제