lomaxx
그는 물었다 12년 전
1,388

C # 의 기본 구성자를 호출하십시오

만약 내가 하고 싶은 게 기본 클래스 및 상속됩니다 전달하십시오 의 기본 생성자는 클래스 &solarisdvd 구성자를 상속됨 클래스, 어떻게 그래요?

예를 들어,

만약 내가 예외) 이 같은 일이 상속됩니다 클래스 i want to do.

class MyExceptionClass : Exception
{
     public MyExceptionClass(string message, string extraInfo)
     {
         //This is where it's all falling apart
         base(message);
     }
}

제가 원하는 것은 기본적으로 구체화하십시오 메시지를 전달할 수 있는 기본 idfsysobject. 구분된다.

Quibblesome
그는 12년 전 댓글을 달았습니다
25

또한 그 만큼 가치가 체인 '이' 를 대체하여, 기존 클래스용 구성자를 수 있습니다 '기본'.

답변 10 개

다음과 같은 기본 클래스의 제대로 구성자를 수정하십시오 구성자를 도왔으매 드러났다.

public class MyExceptionClass : Exception
{
    public MyExceptionClass(string message, string extrainfo) : base(message)
    {
        //other stuff here
    }
}

단, 구성자를 안에 언제든지 할 수 있는 게 아니며 호출하십시오 메서드입니다. # 39 의 가장 큰 이유는 that& you& # 39, re getting in your call in the 구성자를 오류뿐만 바디입니다.

Jon Limjap
Marchy
그는 11년 전 댓글을 달았습니다
41

내 생각엔 누락했습니다 요점이지 문제가 발생할 수 있습니다. 중간에 전화를 통해 기본 구성자를 대한 문제가 오브리든 구성자를. 어쩌면 데이터 유형 기본 구성자를 동일하지 않은 일부 데이터를 전달하기 전에 또는 할 때는 조형 체인에서의 다운되어도. 어떻게 이런 위업을 달성할 투석실에다가?

Jon Limjap
그는 11년 전 댓글을 달았습니다
199

기본 구성자를 security. 할 경우 중간에 관심용 오버라이드합니다 빼낼 수 있는 기본 클래스의 메서드를 호출 충족되었으며 실제 명시적으로. # 39 와 같은 기본 구성자를 they&, re) 객체를 생성할 수 있으므로, 반드시 필요한 것은 기본, 항상 먼저 불렀으매 안전하게 됩니다.

Roman Starkov
그는 9년 전 댓글을 달았습니다
32

그냥 그 때마다 il 와이즈 is 메서드입니다 문의할 수 있습니다. C # 그냥 변화가 발생합니까 동일팔레트에 추가 제한이 상단형 이.

Jasper
그는 6년 전 댓글을 달았습니다
1

클래스에 대한 @romkyns, 그렇습네다. C #, t, no. # 39 doesn& 구조체입니다 대한 기본 생성자를 구조체 호츨 수 있도록 하기 위해서, 그리고 그들이 임상의들의 (일종의) 란 클래스에 대한 셨으며 계속 동일합니까 보드일. (비교할 때, C++, 여기서 똑같은 것은, 제외) 에 저장하는 스택 또는 힙 선택은 made in the 호출하십시오 코드가 아닌 코드와 같은 클래스에서 제한은라이센스 마련되어 있으며)

John Weisz
그는 5년 전 댓글을 달았습니다
18

만하다 '기본' 구성자를 호출됨 before 확인하면서 방법을 블록 액세스됩니다. https://msdn.microsoft.com/en-us/library/ms173115.aspx

Harald Coppoolse
그는 5년 전 댓글을 달았습니다
21

It is not a good design security. 할 경우 기본 클래스 구성자를 미드웨이 도중에 구성자를. 필요한 모든 작업을 수행할 수 있는 것은 결국 구성자를 않니다 해당 작업. 이 경우 효과가 있는 파생됨 구성자를 시작되면 모든 베이스 (base class) 는 이미 완전히 초기화되었습니다 및 파생 클래스 무료 통화 유함수. 이런 경우 설계는 뭔가 보기할 반단면 방식을 구성자를 관심용 한은수의 초기화하지 않는 것이 기본 클래스 (base class) 에 대한 별도의 구성자를 ans 카타시안 않아야 하지만, 아마도 보호 기능

Sebastien
그는 4년 전 댓글을 달았습니다
0

그렇다면 delaymins @jonlimjap 구현하십시오 템플릿에는 메서드 패턴 수신기마다 구성자를?

Jon Limjap
그는 4년 전 댓글을 달았습니다
1

네 지금 다른 역할을 하는 경우 구성자를 @sebastien 그렇기도 하고 아니기도 하다. (추상 메소드) # 39 의 템플릿 메소드 프리미티브 운영체 어졌다면 it& 구축할 수 있습니다. 기타 다른 방법 또는 명시적으로 구축현 전화를 하는 것은 다른 구성자를 구성자를 오버라이드합니다 금지됩니다.

Ken
그는 일 년 전 댓글을 달았습니다
0

그냥 내 2 센트 하는 경우 기본 운영 중인 구성자를 셨으며 / 수정하십시오 반군지역 에 파생 클래스 - 왜안돼요 조작할 수 있는 반군지역 전에 파생 클래스? 네 할 것이 무엇인지, 당신의 파생 클래스 (base class) 는 이쪽요 다 할 수 있을텐데 그냥 뭔가 다른 일을 할 수 없는 것처럼 & # 39 필요로 할 때, # 39, clean& 것 같다. # 39, & # 39 modifying& 때. 파생 클래스 (base class) 에 있는 데이터 푸시할. # 39, 보이지 않는 것이 있으면 I& 키워봤지 - 난 개방적인 정보.

b1nary.atr0phy
그는 일 년 전 댓글을 달았습니다
1

39, & # 39, clean& @ken &quot 뭔가 아니다. # 39, & # 39 modifying& 때. 그러나 that&, 파생 클래스 있는 데이터 베이스 class&quot 꽂으십시오 푸시할 # 39 점, s 를 출력한다. '고양이' 와 '개' 을 할 경우, 두 개의 유도 클래스 (base class) '에서, 만약 내가 저장하는 이름으로 파생합니다 동물' ll be, 상속, I& 문장열 # 39 위로 올라갈 수 있는 자신의 이름을 푸시할 기본 '동물 (string name)' 구성자를. 'Animal.name', '&quot 복귀하십시오 액세스하면 이쪽요 때는 내가 특별히 것' 또는 ',' 기본 '대신 dog&quot &quot cat";;;; animal&quot &quot'.

  • 내 기본 생성자를 사용할 수 있는 방법을 호출하십시오 정적임 * 참고.

class MyExceptionClass : Exception
{
     public MyExceptionClass(string message, string extraInfo) : 
         base(ModifyMessage(message, extraInfo))
     {
     }

     private static string ModifyMessage(string message, string extraInfo)
     {
         Trace.WriteLine("message was " + message);
         return message.ToLowerInvariant() + Environment.NewLine + extraInfo;
     }
}

Abhishek
Jonathon Cwik
그는 5년 전 댓글을 달았습니다
2

이 때문에 내 자신을 찾을 수 있는 잠겨 나는한다 idfsysobject. 클래스는 이렇게 여러 번 있지만, 또한 이를 피할 수 없다면, 당신이 어떻게해야합니다 it& # 39 일은 아닙니다.

Carlos
그는 5년 전 댓글을 달았습니다
0

안녕하세요, 같은 @ChrisS 사용할 수 있습니까? ': 베이스 (&quot, 내 기본 message.") '이 같은 방법을 사용하여,?

kdbanman
그는 5년 전 댓글을 달았습니다
0

C # 뉴브 목마르겠구나 죄송합니다. 왜 전화하시기 '트레이스트라이틀린 (&quot 메시지는 "; + 메시지) '?

Nick Whaley
그는 5년 전 댓글을 달았습니다
5

그건 출력입니다 @kdbanman 디버그 메시지. 관련 기능 없는 것입니다.

Sebastien
그는 4년 전 댓글을 달았습니다
0

아주 튼튼한 여바바 아닙니다. (내가 무슨말 하는지 알지) (. SRP.)

The Red Pea
그는 3년 전 댓글을 달았습니다
4

좋은 답변. [수락됨 오토메이티드] (https://stackoverflow.com/a/12052/1175496), t 처리 할 수 있도록 # 39 doesn& 가져다줄래요. 및 [후속 대한 설명이 해결하십시오] (https://stackoverflow.com/questions/12051/calling-the-base-constructor-in-c-sharp # comment367745_12052) 는 변경하십시오 내가 액세스하도록 기본 클래스. # 39, 내가 don& 없다. [공장 오토메이티드] (https://stackoverflow.com/a/15103087/1175496) 이 수업은 어떻게 내가 통제할 수 있는 인스턴스화되지 가정합니다. # 39, 내가 can& 없다. 뭔가 나를 수 있는 대답을 디렉토리에만 수정하십시오 전달하기 전에 기본.

Aluan Haddad
그는 3년 전 댓글을 달았습니다
0

이에 대해 아무 것도 없다고 deltamove 중간 기능은 nnt 해로운 도덕적으로 중요하지 않습니다. 하지만 케이스 또는 정상화하는 것은 좋지 않다, IMO 로깅하기 览侩 荤례 좋았소 추가 될 것 같다.

Micheal Johnson
그는 3년 전 댓글을 달았습니다
0

이에 대해 내가 너무 고맙다 "사용 '페치할 수 있는 데이터베이스를 만드는 데 필요한 기본 구성자를 컨텍스트로 값을 전달할 생각은 내가 어떻게 그렇게 할 수 없었다.

DonO
그는 2년 전 댓글을 달았습니다
0

위에서 설명한 상황에서 경우. 상속 대신 클래스 (base class) 의 대안으로 솔루션이므로 비호환성의 래퍼 구축해보십시오 수 있습니다.

theonlygusti
그는 9달 전 댓글을 달았습니다
0

그렇다면 '공개 미렉세페시옹 (구체화하십시오 foo): 베이스 ($ &quot foo}, {나쁜거라 ") '하는 것입니다 - 작동합니까? 정적 에로남이네 보다 나은 방법?

기본 구성자를 security. 할 경우 당장 아닌 새로운 (파생됨) 클래스 해야 할 수 있으므로, 일부 데이터 조작 방법을 최적의 솔루션이라는 팩터리의 메서드입니다. 뭘 해야 할 것이 정적 메서드는 클래스에 개인 표시하시겠습니까 너회의 파생됨 구성자를 관심용 필요한 모든 작업을 수행할 것 이상 security. 구성자를 및 반품하십시오 객체에는.

public class MyClass : BaseClass
{
    private MyClass(string someString) : base(someString)
    {
        //your code goes in here
    }

    public static MyClass FactoryMethod(string someString)
    {
        //whatever you want to do with your string before passing it in
        return new MyClass(someString);
    }
}

armanali
Sebastien
그는 4년 전 댓글을 달았습니다
6
    • 원칙 (SRP) 이 될 수 있기 때문에 솔리드로 위반하는 것은 다른 모든 책임을 함께 만드는 것은 돌보는 데 캡슐화됨 클래스는 클래스 가정합니다. 추상 팩토리 사용할 수 있지만 추가 지정값이 복잡성을 불필요한 간단한 코드. 물론 한미 자유무역협정 (fta) 은 솔리드로 위반한 것인지 알고 있는 경우 끄기나 사망자 동일팔레트에 따라 아키텍처입니다 (해결하십시오 문제가 발생할 수 있는 방법, 그리고 향후 설계에서 진단트리).

'기본' (무언가) 를 사용하는 것은 security. 기본 클래스 '이' 키워드를 사용하는 경우, 그러나 너무 구성자를

public ClassName() : this(par1,par2)
{
// do not call the constructor it is called in the this.
// the base key- word is used to call a inherited constructor   
} 

// Hint used overload as often as needed do not write the same code 2 or more times

shA.t
IAmTimCorey
그는 7년 전 댓글을 달았습니다
8

내가 보고, 당신은 그러겄지 설명하란말야 너희는너희가 시도하고 있다. 한 두 개 있는 경우, 그 중 한 명은 다른 클래스를 사용하여 구성자를 &quot, this&quot 참조할 수 있습니다. 키워드 partnernet 용도에 &quot base"; 이 때 호출하십시오 상속됨 구성자를. 그러나 이 isn& # 39, t, t really 이 때문에 이 isn& 주문하신거 어떤 OP # 39 위) 이 추가.

public class MyExceptionClass : Exception
{
    public MyExceptionClass(string message,
      Exception innerException): base(message, innerException)
    {
        //other stuff here
    }
}

내부 idfsysobject. 중 하나로 구성자를 전달할 수 있습니다.

  • [1] 및 [레임워크 설계 가이드라인] 에서 프스코프 rules.*:

1. 사용자 정의 idfsysobject. /dev/raw/raw200 끝나는 이름을 가지고 있는 idfsysobject.

    class MyException : Exception

2. Idfsysobject. 한다는 것이다.

    public class MyException : Exception

3. 21032: 2 는 표준 구성자를 idfsysobject. 한다.]

  • 공공 파라메트리스 구성자를.
  • 공공 구성자를 한 문자열 인수를.
  • 공공 구성자를 한 구체화하십시오 및 예외 (랩 수 있기 때문에 다른 예외).
  • A 유형은 방수 및 민간 않을 경우 직렬화하지 구성자를 금지되었는지 경우 유형: 밀봉되. 따라 MSDN:

[시리얼화가 가능합니다 ()] public class 미렉세페시옹: Idfsysobject. { 공용 미렉세페시옹 () { 모든 유형별 로직, // 추가 공급 기본값입니다 메시지. }

공용 미렉세페시옹 (구체화하십시오 메시지): 베이스 (메시지) { 유형별 // 추가할 수 없다. } 공용 미렉세페시옹 (구체화하십시오 메시지를 idfsysobject. 네렉세페시옹): 베이스 (메시지를 네렉세페시옹) { 유형별 논리를 // 추가할 경우 내부 존재한다. } 금지되었는지 미렉세페시옹 (세리얼리제이션린포 정보, 스트림링콘테스트 컨텍스트로): 베이스 (정보, 컨텍스트로) { 유형별 직렬화하지 구성자를 // 구현할 수 없다. } }

또는

    [Serializable()]
    public sealed class MyException : Exception
    {
      public MyException()
      {
         // Add any type-specific logic, and supply the default message.
      }

      public MyException(string message): base(message) 
      {
         // Add any type-specific logic.
      }
      public MyException(string message, Exception innerException): 
         base (message, innerException)
      {
         // Add any type-specific logic for inner exceptions.
      }
      private MyException(SerializationInfo info, 
         StreamingContext context) : base(info, context)
      {
         // Implement type-specific serialization constructor logic.
      }
    }  

[1]: https://books.google.co.th/books? id = = = = exception% PT394&amp, dq, 액화석유가스 (lpg), pg 39d1wz598ecc&amp pt394&amp 20fxcop&amp, 소스 = = = = = fr&amp, sa, hl, 서명, ots bl&amp bo6ngdvi4f&amp dfz7uccpk_lviztvatsz2rlxpy&amp x&amp, v = q =, = 0ahukewi88-qo9mhkahuph44khvmdch8q6aeiudag # 베드 onepage&amp exception% 20fxcop&amp, f = false

또한 함께 할 수 있는 조건부 확인란 구성자를 매개 변수를 좀 더 유연하게.

public MyClass(object myObject=null): base(myObject ?? new myOtherObject())
{
}

또는

public MyClass(object myObject=null): base(myObject==null ? new myOtherObject(): myObject)
{
}

wchoward
MarzSocks
그는 4년 전 댓글을 달았습니다
1

39, t, 단어 &quot class&quot don& 제거해야 합니다. 이후 그것은꿈의 구성자를 사용 예.

여기에 나열된 따라 일부 다른 답을 꽂으십시오 매개변수입니다 기본 클래스 구성자를 전달할 수 있습니다. 문의 구성자를 것이 좋다 (base class) 맨 앞에 구성자를 단축시킵니다 상속됨 구분된다.

public class MyException : Exception
{
    public MyException(string message, string extraInfo) : base(message)
    {
    }
}

난 참고로 너회의 들어 사용하는 것으로, 그래서 내가 세운 적이 없다. "'에스트레인포"' 매개변수입니다 연결 할 수 있습니다 "'에스트레인포"' 문자열 매개 변수를 "'메시지' 를 통해 idfsysobject. 속성 (것으로 보인다고 이 질문에 대한 답을 에서 무시됨 중입니다 수락됨 코드와 해당).

이것은 단순히 달성됩니다 호출하여 기본 클래스, 속성 업데이트 후 구성자를 메시지를 통해 추가 정보.

public class MyException: Exception
{
    public MyException(string message, string extraInfo) : base($"{message} Extra info: {extraInfo}")
    {
    }
}

CShark
Andy Middleditch
그는 일 년 전 댓글을 달았습니다
0

39 만 도왔으매 솔루션이므로 티스트 세이지 읽어옵니다 can&, 빗나갔다.

CShark
그는 일 년 전 댓글을 달았습니다
0

아니, 아니야 단지 그 @andymiddleditch 할당 보면안돼. # System_Exception_Message 보기 = netcore-2.2 https://docs.microsoft.com/en-us/dotnet/api/system.exception.message?

CShark
그는 일 년 전 댓글을 달았습니다
0

하지만 넌 내 들어 있는 수정하십시오 @andymiddleditch 이전 버전의 않을 것이라는 메시지를 속성의 보면안돼 세터 컴파일하십시오 때문입니다. 난 내 예제에서와 업데이트되도록 이와 관련된 작업을 (이제 컴파일하십시오). 바빴잖아요

class Exception
{
     public Exception(string message)
     {
         [...]
     }
}

class MyExceptionClass : Exception
{
     public MyExceptionClass(string message, string extraInfo)
     : base(message)
     {
         [...]
     }
}

public class MyException : Exception
{
    public MyException() { }
    public MyException(string msg) : base(msg) { }
    public MyException(string msg, Exception inner) : base(msg, inner) { }
}

Donat Sasin
vibs2006
그는 2년 전 댓글을 달았습니다
1

이것이 정답입니다 포함되어 있어 과부하를 구성자를 잘 알려져 있다.