首页 文章

在C#中调用基础构造函数

提问于
浏览
1227

如果我从基类继承并希望将继承类的构造函数中的某些东西传递给基类的构造函数,我该怎么做?

例如,

如果我从Exception类继承,我想做这样的事情:

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

基本上我想要的是能够将字符串消息传递给基本的Exception类 .

10 回答

  • 5

    确实使用 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
    
  • 11
    public class MyException : Exception
    {
        public MyException() { }
        public MyException(string msg) : base(msg) { }
        public MyException(string msg, Exception inner) : base(msg, inner) { }
    }
    
  • 82

    将构造函数修改为以下内容,以便正确调用基类构造函数:

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

    请注意,构造函数不是您可以在方法中随时调用的东西 . 这就是你在构造函数体中调用错误的原因 .

  • 441

    请注意,您可以在对基础构造函数的调用中使用 static 方法 .

    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;
         }
    }
    
  • 23

    From Framework Design Guidelines and FxCop rules.

    1. Custom Exception should have a name that ends with Exception

    class MyException : Exception
    

    2. Exception should be public

    public class MyException : Exception
    

    3. CA1032: Exception should implements standard constructors.

    • 公共无参数构造函数 .

    • 具有一个字符串参数的公共构造函数 .

    • 具有一个字符串和Exception的公共构造函数(因为它可以包装另一个Exception) .

    • 如果类型未密封,则序列化构造函数受保护;如果类型已密封,则为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.
          }
        }
    
  • 5
    class Exception
    {
         public Exception(string message)
         {
             [...]
         }
    }
    
    class MyExceptionClass : Exception
    {
         public MyExceptionClass(string message, string extraInfo)
         : base(message)
         {
             [...]
         }
    }
    
  • 1546

    如果您需要调用基础构造函数但不是立即调用,因为新(派生)类需要进行一些数据操作,最好的解决方案是采用工厂方法 . 你需要做的是标记私有你的派生构造函数,然后在你的类中创建一个静态方法,它将执行所有必要的东西,然后调用构造函数并返回对象 .

    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);
        }
    }
    
  • 21

    根据此处列出的其他一些答案,您可以将参数传递给基类构造函数 . 建议在继承类的构造函数的开头调用基类构造函数 .

    public class MyException : Exception
    {
        public MyException(string message, string extraInfo) : base(message)
        {
            this.Message = $"{message} Extra info: {extraInfo}";
            // You can omit the 'this.' portion above...
        }
    }
    

    我注意到在您的示例中您从未使用过 extraInfo 参数,因此我假设您可能希望将 extraInfo 字符串参数连接到异常的 Message 属性(似乎在接受的答案和代码中忽略了这一点)你的问题) .

    这可以通过调用基类构造函数,然后使用额外信息更新Message属性来实现 .

    或者,由于 Message 属性是从基类继承的,因此您甚至不必显式调用基类构造函数 . 您可以直接从继承类的构造函数更新 Message 属性,如下所示:

    public class MyException : Exception
    {
        public MyException(string message, string extraInfo)
        {
            this.Message = $"{message} Extra info: {extraInfo}";
            // You can omit the 'this.' portion above...
        }
    }
    
  • 6
    public class MyExceptionClass : Exception
    {
        public MyExceptionClass(string message,
          Exception innerException): base(message, innerException)
        {
            //other stuff here
        }
    }
    

    您可以将内部异常传递给其中一个构造函数 .

  • 13

    您还可以在构造函数中使用参数进行条件检查,这允许一些灵活性 .

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

    要么

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

相关问题