Jika saya mewarisi dari kelas dasar dan ingin menyampaikan sesuatu dari konstruktor mewarisi kelas konstruktor kelas dasar, bagaimana saya melakukannya?
Misalnya,
Jika saya mewarisi dari kelas Pengecualian 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 untuk dapat lulus string pesan ke dasar kelas Pengecualian.
Mengubah constructor berikut sehingga memanggil konstruktor kelas dasar dengan benar:
public class MyExceptionClass : Exception
{
public MyExceptionClass(string message, string extrainfo) : base(message)
{
//other stuff here
}
}
Perhatikan bahwa constructor adalah bukan sesuatu yang dapat anda hubungi kapan saja dalam sebuah metode. Yang's alasan anda're mendapatkan kesalahan dalam panggilan anda dalam konstruktor tubuh.
Perhatikan bahwa anda dapat menggunakan statis metode dalam panggilan ke dasar konstruktor.
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;
}
}
Jika anda perlu untuk memanggil base constructor tapi tidak langsung karena anda baru (yang berasal) kelas perlu melakukan beberapa manipulasi data, solusi terbaik adalah untuk menggunakan metode pabrik. Apa yang perlu anda lakukan adalah untuk menandai pribadi anda berasal konstruktor, kemudian membuat metode statis di kelas anda yang akan melakukan semua hal yang diperlukan dan kemudian memanggil konstruktor dan kembali 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);
}
}
Memang benar menggunakan base
(sesuatu) untuk memanggil konstruktor kelas dasar, tetapi dalam kasus overloading menggunakan ini
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
Dari Desain Kerangka Pedoman dan FxCop aturan.:
1. Pengecualian kustom harus memiliki nama yang diakhiri dengan Pengecualian
class MyException : Exception
2. Pengecualian harus publik
public class MyException : Exception
3. CA1032: Pengecualian harus menerapkan standar konstruktor.
[Serializable()] public class MyException : Pengecualian { publik MyException() { // Menambahkan jenis-spesifik logika, dan pasokan pesan default. }
publik MyException(string pesan): base(pesan) { // Menambahkan jenis-logika tertentu. } publik MyException(string pesan, Terkecuali innerException): base (pesan, innerException) { // Menambahkan jenis-logika tertentu untuk dalam pengecualian. } dilindungi MyException(SerializationInfo info, StreamingContext konteks) : base(info, konteks) { // Menerapkan jenis tertentu serialisasi konstruktor logika. } }
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.
}
}
Anda juga dapat melakukan bersyarat periksa dengan parameter pada 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)
{
}
Sesuai beberapa jawaban lain yang tercantum di sini, anda dapat melewatkan parameter ke dasar kelas konstruktor. Disarankan untuk memanggil konstruktor kelas dasar pada awal konstruktor untuk anda mewarisi kelas.
public class MyException : Exception
{
public MyException(string message, string extraInfo) : base(message)
{
}
}
Saya perhatikan bahwa dalam contoh anda anda tidak pernah menggunakan extraInfo
parameter, jadi saya berasumsi anda mungkin ingin menggabungkan extraInfo
string parameter ke Pesan
milik anda pengecualian (tampaknya bahwa ini adalah diabaikan dalam jawaban yang diterima dan kode dalam pertanyaan anda).
Hal ini hanya dicapai dengan menerapkan dasar kelas konstruktor, dan kemudian memperbarui Pesan properti dengan tambahan info.
public class MyException: Exception
{
public MyException(string message, string extraInfo) : base($"{message} Extra info: {extraInfo}")
{
}
}
public class MyException : Exception
{
public MyException() { }
public MyException(string msg) : base(msg) { }
public MyException(string msg, Exception inner) : base(msg, inner) { }
}