2012-10-20 5 views
1

내가는 C++ 프로그래머 해요, 그리고 난 내가 그래서 여기에 소스 코드를 상속을 테스트 할 수있는 작은 프로그램을 작성한 C#에서 새로운 해요 :C# 상속 생성자 자식 및 부모 ??

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Lesson3_Class_inherit_ 
{ 
    public class Personne 
    { 
     public string Name; 
     public int Age; 
     public Personne() { } 
     public Personne(string _Name, int _Age) 
     { 
      Name = _Name; 
      Age = _Age; 
      Console.WriteLine("Constrcut Personne Called\n"); 

     } 
     ~Personne() 
     { 
      Console.WriteLine("Destruct Personne Called\n"); 
     } 


    }; 
    class Humain : Personne 
    { 
     public string Langue; 
     public Humain(string _Name, int _Age,string _Langue) 
     { 
     Console.WriteLine("Constrcut Humain Called\n"); 
     Name = _Name; 
     Age = _Age; 
     Langue =_Langue; 
     } 



    }; 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Humain H1 = new Humain("majdi", 28, "Deutsch"); 

      Console.ReadLine(); 
     } 
    } 
} 

출력 : Humain는 \ 호출과 구조에 대한 구축합니다 Personne 클래스는 왜 불리지 않았습니까 !!! C++에서 부모 클래스 생성자가 먼저 호출됩니다 !! 도와주세요!

+0

[이 질문을보십시오 (http://stackoverflow.com/questions/12051/calling-base-constructor-in-c-sharp). – Andy0708

+2

'Personne' _was_의 생성자가 호출되었습니다. 예상했던 생성자가 아닙니다. – shambulator

+0

참고 사항 : * 매우 * 드물게 C#에서 소멸자를 정의하려고합니다. http://stackoverflow.com/questions/4898733/when-should-i-create-a-destructor – Timbo

답변

3

C#에서는 명시 적으로 상위 생성자를 base 키워드를 사용하여 호출해야합니다. 이 기본 생성자를 호출하기 때문에 그렇게 Humain는

class Humain : Personne 
    { 
     public string Langue; 
     public Humain(string _Name, int _Age,string _Langue) : base(_Name, _Age) 
     { 
     Console.WriteLine("Constrcut Humain Called\n"); 
     Name = _Name; 
     Age = _Age; 
     Langue =_Langue; 
     } 



    }; 
+0

정말 고마워 !! 일반적으로 부모 생성자는 직접 호출되어야합니다! C++처럼! 왜 그들이이 행동을 바꿨는지 모르겠다! – satyres

+0

호출 여부를 제어 할 수 있습니다. 그것은 좋은 이점입니다. 또한 특정 생성자를 대상으로 지정할 수도 있습니다. – LightStriker

+0

네 맞아! C++로 습관을 바꾸는 것은 쉽지 않습니다 :) – satyres

1

과 같을 것이다. 다른 생성자를 호출하려면 다음과 같이 작성해야합니다.

base(_Name, _Age); 

Humain의 생성자 시작 부분.

class Humain : Personne 
{ 
    public string Langue; 
    public Humain(string _Name, int _Age, string _Langue) : base (_Name, _Age) 
    { 
     Console.WriteLine("Constrcut Humain Called\n"); 
     Name = _Name; 
     Age = _Age; 
     Langue = _Langue; 
    } 
} 

귀하의 요구 사항에 따라, 당신도 대신 매개 변수화 생성자의 기본 생성자를뿐만 아니라 호출 할 수 있습니다

+0

이것은 올바른 대답입니다. (1) C++ 에서처럼 기본 생성자를 명시 적으로 호출 할 필요가 없으며 (2) 그렇지 않은 경우 기본 생성자가 호출되지 않는다는 의미는 아닙니다. 이 동작은 실제로 C++과 매우 유사하지만 약간의 구문상의 차이가 있습니다. P – shambulator

1
public Humain(string _Name, int _Age,string _Langue) : base(_Name, _Age) 
{ 
    Lange = _Langue; 
} 
+0

감사 : 정말 작동합니다! – satyres

0

봅니다 기본 클래스 생성자 이런 식으로 호출 .

public Humain(string _Name, int _Age, string _Langue) : base() 
    { 
     Console.WriteLine("Constrcut Humain Called\n"); 
     Name = _Name; 
     Age = _Age; 
     Langue = _Langue; 
    } 
+0

내 대답이 도움이 되었습니까? –