呼び出しのベースのコンストラクタクライアントまで、フルのC#

StackOverflow https://stackoverflow.com/questions/12051

  •  08-06-2019
  •  | 
  •  

質問

だから受け継ぐラスの基底クラスというからのコンストラクタを継承したクラスのコンストラクタの基底クラスをどのようにということですかね?

例えば、

だから受け継ぐすることを通知する例外クラスでもう少し前向きなことをやりたいこのように:

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
    }
}

このコンストラクタはないでかつ次の各号のいずれかにメソッドになっています。その理由を取得しているエコンストラクタで呼び出します。

他のヒント

注意利用できる 静的 方法以内に電話のベースコンストラクタです。

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

が必要な場合は、ベースのコンストラクタがすぐにあなたの新しい派生クラスのニーズにデータ操作、最適なソリューションはリゾートには工場出荷方法。必要なものはマークの民間の自由来のコンストラクタでは、その静的メソッドが、クラスまでの全ての必要なもの以降のコンストラクタは、オブジェクトを返却します。

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

その利用 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
public class MyExceptionClass : Exception
{
    public MyExceptionClass(string message,
      Exception innerException): base(message, innerException)
    {
        //other stuff here
    }
}

とすることができます内部の例外をコンストラクタ.

から 枠組みの設計ガイドライン とFxCop。:

1.カスタム例外は終了すると例外

    class MyException : Exception

2.例外を公開

    public class MyException : Exception

3. CA1032:例外は実施基準のコンストラクタ.

  • 公parameterlessコンストラクタです。
  • Publicコンストラクタを一つの文字列を引数に使います。
  • Publicコンストラクタを一つの文字列と例外としてで包みもます。
  • 直列化コンストラクタ保護の場合はタイプに封入されません私の場合はタイプで密封されています。に基づく 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.
      }
    }  

できるものチェックインの条件付パラメータのコンストラクタは、この柔軟性です。

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

または

public MyClass(object myObject=null): base(myObject==null ? new myOtherObject(): myObject)
{
}
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) { }
}

などのその他の回答をこちらに掲載されているパスのパラメータの基底クラスのコンストラクタです。しておくといいでしょう呼び基底クラスのコンストラクタの初めにコンストラクタお継承したクラスです。

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

いるということに注意してくださおどを利用したことがないことを extraInfo パラメータで定するために連結の extraInfo stringパラメータの Message 物件の例外(ここでは無視してるの受け答えのコードは?

これは単なる実現を呼び出すことにより基底クラスのコンストラクタは、その後更新のメッセージプロパティの情報

public class MyException: Exception
{
    public MyException(string message, string extraInfo) : base($"{message} Extra info: {extraInfo}")
    {
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top