Если я наследую от базового класса и хочу передать что-то из конструктора наследуемого класса в конструктор базового класса, как мне это сделать?
Например,
Если я наследую от класса Exception, я хочу сделать что-то вроде этого:
class MyExceptionClass : Exception
{
public MyExceptionClass(string message, string extraInfo)
{
//This is where it's all falling apart
base(message);
}
}
По сути, я хочу иметь возможность передавать строковое сообщение базовому классу Exception.
Измените свой конструктор следующим образом, чтобы он правильно вызывал конструктор базового класса:
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);
}
}
Это - истинное использование 'основа' (что-то), чтобы вызвать конструктора базового класса, но в случае перегрузки использования 'это' ключевое слово
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
}
}
Вы можете передать внутреннее исключение в один из конструкторов.
От [Руководство по проектированию Структуры] [1] и правила FxCop. :
1. У таможенного Исключения должно быть имя, которое заканчивается за Исключением
class MyException : Exception
2. Исключение должно быть общественное
public class MyException : Exception
3. CA1032: Исключение должно конструкторы стандарта орудий.
Общественный конструктор без параметров.
Общественный конструктор с одним аргументом последовательности.
Общественный конструктор с одной последовательностью и Исключением (поскольку это может обернуть другое Исключение).
Конструктор преобразования в последовательную форму защитил, если тип не запечатан и не частный, если тип запечатан. На основе MSDN:
[Сериализуемый ()]
общественный класс MyException: Исключение
{
общественный MyException ()
{
//Добавьте любую определенную для типа логику и поставляйте сообщение по умолчанию.
}
общественный MyException (натягивают сообщение): основа (сообщение)
{
//Добавьте любую определенную для типа логику.
}
общественный MyException (натягивают сообщение, Исключение innerException):
основа (сообщение, innerException)
{
//Добавьте любую определенную для типа логику для внутренних исключений.
}
защищенный MyException (информация о SerializationInfo,
Контекст StreamingContext): основа (информация, контекст)
{
//Осуществите определенную для типа логику конструктора преобразования в последовательную форму.
}
}
или
[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.
}
}
[1]: https://books.google.co.th/books? id=39d1wZ598ecC&pg=PT394&lpg=PT394&dq=exception%20fxcop&source=bl&ots=bO6nGDVi4f&sig=DFZ7ucCPK__LvIzTVaTSZ2rlXpY&hl=fr&sa=X&ved=0ahUKEwi88-qO9MHKAhUPH44KHVmdCh8Q6AEIUDAG#v=onepage&q=exception%20fxcop&f=false
Вы можете также сделать условную проверку с параметрами в конструкторе, который позволяет некоторую гибкость.
public MyClass(object myObject=null): base(myObject ?? new myOtherObject())
{
}
или
public MyClass(object myObject=null): base(myObject==null ? new myOtherObject(): myObject)
{
}
Согласно некоторым из других ответов, перечисленных здесь, Вы можете передать параметры в конструктора базового класса. Рекомендуется вызвать Вашего конструктора базового класса в начале конструктора для Вашего унаследованного класса.
public class MyException : Exception
{
public MyException(string message, string extraInfo) : base(message)
{
}
}
Я отмечаю, что в Вашем примере Вы никогда не использовали' ''extraInfo''' параметр, таким образом, я предположил, что Вы могли бы хотеть связать' ''extraInfo''' параметр последовательности к' ''сообщению''' собственность Вашего исключения (кажется, что это игнорируется в принятом ответе и кодексе в Вашем вопросе).
Это просто достигнуто, призвав конструктора базового класса, и затем обновив собственность сообщения с дополнительной информацией.
public class MyException: Exception
{
public MyException(string message, string extraInfo) : base($"{message} Extra info: {extraInfo}")
{
}
}
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) { }
}