1727

基本クラスから継承し、継承されたクラスのコンストラクターから基本クラスのコンストラクターに何かを渡したい場合、どうすればよいですか?

たとえば、Exceptionクラスから継承する場合、次のようなことを行います。

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

基本的に私が欲しいのは、文字列メッセージを基本のExceptionクラスに渡せるようにすることです。

4

10 に答える 10

2093

基本クラスのコンストラクターが正しく呼び出されるように、コンストラクターを次のように変更します。

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

コンストラクターは、メソッド内でいつでも呼び出すことができるものではないことに注意してください。これが、コンストラクター本体の呼び出しでエラーが発生する理由です。

于 2008-08-15T07:40:22.157 に答える
590

基本コンストラクターへの呼び出し内で静的メソッドを使用できることに注意してください。

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;
     }
}
于 2010-04-28T17:34:20.497 に答える
114

基本コンストラクターを呼び出す必要があるが、新しい (派生) クラスが何らかのデータ操作を行う必要があるためにすぐに呼び出す必要がない場合、最善の解決策はファクトリ メソッドに頼ることです。あなたがする必要があるのは、派生コンストラクターをプライベートにマークしてから、必要なすべてのことを行い、後でコンストラクターを呼び出してオブジェクトを返すクラスで静的メソッドを作成することです。

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);
    }
}
于 2013-02-27T02:22:07.103 に答える
44

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
于 2013-11-11T11:32:42.350 に答える
32
public class MyExceptionClass : Exception
{
    public MyExceptionClass(string message,
      Exception innerException): base(message, innerException)
    {
        //other stuff here
    }
}

コンストラクターの 1 つに内部例外を渡すことができます。

于 2009-12-04T05:03:34.580 に答える
22

フレームワーク設計ガイドラインと FxCop ルールから。:

1.カスタム例外には、例外で終わる名前が必要です

    class MyException : Exception

2.例外は公開する必要があります

    public class MyException : Exception

3. CA1032: 例外は標準コンストラクターを実装する必要があります。

  • パラメーターなしのパブリック コンストラクター。
  • 1 つの文字列引数を持つパブリック コンストラクター。
  • 1 つの文字列と Exception を持つパブリック コンストラクター (別の Exception をラップできるため)。
  • 型がシールされていない場合は保護され、型がシールされている場合はプライベートなシリアル化コンストラクター。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.
      }
    }  
于 2016-01-24T07:34:21.750 に答える
20

コンストラクターでパラメーターを使用して条件チェックを行うこともできるため、ある程度の柔軟性が得られます。

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

また

public MyClass(object myObject=null): base(myObject==null ? new myOtherObject(): myObject)
{
}
于 2016-05-27T21:27:43.060 に答える
12
public class MyException : Exception
{
    public MyException() { }
    public MyException(string msg) : base(msg) { }
    public MyException(string msg, Exception inner) : base(msg, inner) { }
}
于 2016-04-07T12:06:09.330 に答える