질문자 :lomaxx
기본 클래스에서 상속하고 상속된 클래스의 생성자에서 기본 클래스의 생성자로 무언가를 전달하려는 경우 어떻게 해야 합니까?
예를 들어 Exception 클래스에서 상속하는 경우 다음과 같이 하고 싶습니다.
class MyExceptionClass : Exception { public MyExceptionClass(string message, string extraInfo) { //This is where it's all falling apart base(message); } }
기본적으로 내가 원하는 것은 기본 예외 클래스에 문자열 메시지를 전달할 수 있는 것입니다.
기본 클래스 생성자를 올바르게 호출하도록 생성자를 다음과 같이 수정합니다.
public class MyExceptionClass : Exception { public MyExceptionClass(string message, string extrainfo) : base(message) { //other stuff here } }
생성자는 메서드 내에서 언제든지 호출할 수 있는 것이 아닙니다. 이것이 생성자 본문에서 호출에 오류가 발생하는 이유입니다.
Jon Limjap기본 생성자 호출 내에서 정적 메서드를 사용할 수 있습니다.
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; } }
Axl기본 생성자를 호출해야 하지만 새(파생) 클래스가 일부 데이터 조작을 수행해야 하기 때문에 바로 호출할 필요가 없는 경우 가장 좋은 솔루션은 팩토리 메서드에 의존하는 것입니다. 당신이 해야 할 일은 파생된 생성자를 비공개로 표시한 다음 클래스에서 필요한 모든 작업을 수행하고 나중에 생성자를 호출하고 개체를 반환하는 정적 메서드를 만드는 것입니다.
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); } }
aalimian기본 클래스 생성자를 호출 base
(무언가)을 사용하는 것은 사실 this
키워드를 사용합니다.
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
Janus Pedersenpublic class MyExceptionClass : Exception { public MyExceptionClass(string message, Exception innerException): base(message, innerException) { //other stuff here } }
생성자 중 하나에 내부 예외를 전달할 수 있습니다.
SnowBEE프레임워크 디자인 지침 및 FxCop 규칙에서. :
1. 사용자 정의 예외는 예외로 끝나는 이름을 가져야 합니다.
class MyException : Exception
2. 예외는 공개되어야 합니다.
public class MyException : Exception
3. CA1032: 예외는 표준 생성자를 구현해야 합니다.
- 매개 변수가 없는 공용 생성자입니다.
- 하나의 문자열 인수가 있는 공용 생성자.
- 하나의 문자열과 예외가 있는 공개 생성자(다른 예외를 래핑할 수 있음).
형식이 봉인되지 않은 경우 직렬화 생성자가 보호되고 형식이 봉인된 경우 private입니다. MSDN 기준:
[Serializable()] public 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. } protected MyException(SerializationInfo info, StreamingContext context) : base(info, context) { // Implement type-specific serialization constructor logic. } }
또는
[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. } }
Fab또한 생성자의 매개변수를 사용하여 조건부 검사를 수행할 수 있어 유연성이 있습니다.
public MyClass(object myObject=null): base(myObject ?? new myOtherObject()) { }
또는
public MyClass(object myObject=null): base(myObject==null ? new myOtherObject(): myObject) { }
dynamiclynk여기에 나열된 다른 답변에 따라 기본 클래스 생성자에 매개변수를 전달할 수 있습니다. 상속된 클래스의 생성자의 시작 부분에서 기본 클래스 생성자를 호출하는 것이 좋습니다.
public class MyException : Exception { public MyException(string message, string extraInfo) : base(message) { } }
귀하의 예에서는 extraInfo
extraInfo
문자열 매개변수를 Message
속성에 연결하고 싶다고 가정했습니다. 귀하의 질문).
이것은 기본 클래스 생성자를 호출한 다음 추가 정보로 Message 속성을 업데이트함으로써 간단히 달성됩니다.
public class MyException: Exception { public MyException(string message, string extraInfo) : base($"{message} Extra info: {extraInfo}") { } }
CSharkpublic class MyException : Exception { public MyException() { } public MyException(string msg) : base(msg) { } public MyException(string msg, Exception inner) : base(msg, inner) { } }
Donat Sasin최신 C# 기능, 즉 out var
를 사용하면 정적 팩토리 메서드를 제거할 수 있습니다. 나는 (우연히) inse base-"call"이라는 메소드의 var 매개변수가 생성자 본문으로 흐르는 것을 발견했습니다.
예를 들어 다음에서 파생하려는 기본 클래스를 사용합니다.
public abstract class BaseClass { protected BaseClass(int a, int b, int c) { } }
실행하려는 비컴파일 의사 코드:
public class DerivedClass : BaseClass { private readonly object fatData; public DerivedClass(int m) { var fd = new { A = 1 * m, B = 2 * m, C = 3 * m }; base(fd.A, fd.B, fd.C); // base-constructor call this.fatData = fd; } }
필요한 모든 기본 인수(필요한 경우 추가 데이터 포함)를 생성하고 정적 팩토리 메서드를 사용하지 않고 외부에 일반 생성자만 생성하는 정적 개인 도우미 메서드를 사용하는 솔루션:
public class DerivedClass : BaseClass { private readonly object fatData; public DerivedClass(int m) : base(PrepareBaseParameters(m, out var b, out var c, out var fatData), b, c) { this.fatData = fatData; Console.WriteLine(new { b, c, fatData }.ToString()); } private static int PrepareBaseParameters(int m, out int b, out int c, out object fatData) { var fd = new { A = 1 * m, B = 2 * m, C = 3 * m }; (b, c, fatData) = (fd.B, fd.C, fd); // Tuples not required but nice to use return fd.A; } }
springy76출처 : http:www.stackoverflow.com/questions/12051/calling-the-base-constructor-in-c-sharp