Pertanyaan Memanggil konstruktor dasar di C #


Jika saya mewarisi dari kelas dasar dan ingin meneruskan sesuatu dari konstruktor kelas yang diwariskan ke konstruktor kelas dasar, bagaimana saya melakukannya?

Sebagai contoh,

Jika saya mewarisi dari kelas Exception saya ingin melakukan sesuatu seperti ini:

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

Pada dasarnya apa yang saya inginkan adalah dapat meneruskan pesan string ke kelas Exception dasar.


1154
2017-08-15 07:39


asal


Jawaban:


Ubah konstruktor Anda ke yang berikut ini sehingga memanggil konstruktor kelas dasar dengan benar:

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

Perhatikan bahwa konstruktor bukanlah sesuatu yang dapat Anda panggil kapan saja dalam suatu metode. Itulah alasan Anda mendapatkan kesalahan dalam panggilan Anda di badan konstruktor.


1471
2017-08-15 07:40



Perhatikan bahwa Anda dapat menggunakan statis metode dalam panggilan ke konstruktor dasar.

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

420
2018-04-28 17:34



Jika Anda perlu memanggil konstruktor dasar tetapi tidak segera karena kelas baru (turunan) Anda perlu melakukan manipulasi data, solusi terbaik adalah menggunakan metode pabrik. Yang perlu Anda lakukan adalah menandai konstruktor turunan Anda, lalu membuat metode statis di kelas Anda yang akan melakukan semua hal yang diperlukan dan kemudian memanggil konstruktor dan mengembalikan objek.

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

77
2018-02-27 02:22



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

Anda dapat melewati pengecualian batin ke salah satu konstruktor.


21
2017-12-04 05:03



Memang benar menggunakan base (Sesuatu) untuk memanggil konstruktor kelas dasar, tetapi dalam kasus overloading menggunakan this kata kunci

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

16
2017-11-11 11:32



Dari Pedoman Perancangan Kerangka dan aturan FxCop.:

1. Pengecualian Khusus harus memiliki nama yang diakhiri dengan Pengecualian

    class MyException : Exception

2. Pengecualian harus bersifat publik

    public class MyException : Exception

3 CA1032: Pengecualian harus menerapkan konstruktor standar.

  • Sebuah konstruktor tanpa parameter publik.
  • Seorang konstruktor publik dengan satu argumen string.
  • Konstruktor publik dengan satu string dan Exception (karena dapat membungkus Exception lain).
  • Sebuah konstruktor serialisasi dilindungi jika jenisnya tidak disegel dan bersifat pribadi jika jenisnya disegel. Berdasarkan 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.
      }
    }  
    

atau

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

12
2018-01-24 07:34



Anda juga dapat melakukan pemeriksaan bersyarat dengan parameter dalam konstruktor, yang memungkinkan beberapa fleksibilitas.

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

atau

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

7
2018-05-27 21:27



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

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

4
2018-02-26 04:11



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

4
2018-04-07 12:06



Seperti beberapa jawaban lainnya yang tercantum di sini, Anda dapat meneruskan parameter ke dalam konstruktor kelas dasar. Disarankan untuk memanggil konstruktor kelas dasar Anda di awal konstruktor untuk kelas warisan Anda.

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

Saya perhatikan bahwa dalam contoh Anda, Anda tidak pernah menggunakan extraInfo parameter, jadi saya berasumsi Anda mungkin ingin menggabungkan extraInfo parameter string ke Message milik pengecualian Anda (tampaknya ini diabaikan dalam jawaban yang diterima dan kode dalam pertanyaan Anda).

Ini hanya dicapai dengan menerapkan konstruktor kelas dasar, dan kemudian memperbarui properti Pesan dengan info tambahan.

Atau, sebagai Message properti diwarisi dari kelas dasar, Anda bahkan tidak perlu memanggil konstruktor kelas dasar secara eksplisit. Anda hanya bisa memperbarui Message properti langsung dari konstruktor kelas warisan Anda, seperti ini:

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

4
2018-03-14 12:38