kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 lomaxx
lomaxx
Вопрос

Вызов базового конструктора в C#

Если я наследую от базового класса и хочу передать что-то из конструктора наследуемого класса в конструктор базового класса, как мне это сделать?

Например,

Если я наследую от класса Exception, я хочу сделать что-то вроде этого:

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

По сути, я хочу иметь возможность передавать строковое сообщение базовому классу Exception.

1388 2008-08-15T07:39:23+00:00 10
Ola Ström
Ola Ström
Редактировал вопрос 5-го апреля 2019 в 11:32
Программирование
constructor
c#
inheritance
Решение / Ответ
Jon Limjap
Jon Limjap
15-го августа 2008 в 7:40
2008-08-15T07:40:22+00:00
Дополнительно
Источник
Редактировать
#8415706

Измените свой конструктор следующим образом, чтобы он правильно вызывал конструктор базового класса:

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

Обратите внимание, что конструктор - это не то, что вы можете вызвать в любое время внутри метода. По этой причине вы получаете ошибки при вызове в теле конструктора.

1727
0
 Axl
Axl
28-го апреля 2010 в 5:34
2010-04-28T17:34:20+00:00
Дополнительно
Источник
Редактировать
#8415709

Обратите внимание, что вы можете использовать статические методы внутри вызова базового конструктора.

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;
     }
}
 Abhishek
Abhishek
Редактировал ответ 31-го августа 2015 в 5:17
486
0
 armanali
armanali
27-го февраля 2013 в 2:22
2013-02-27T02:22:07+00:00
Дополнительно
Источник
Редактировать
#8415711

Если Вы должны вызвать основного конструктора, но не сразу же, потому что Ваш новый (полученный) класс должен сделать некоторое манипулирование данными, лучшее решение состоит в том, чтобы обратиться к фабричному методу. То, что Вы должны сделать, должно отметить частный Ваш полученный конструктор, затем сделать статический метод в Вашем классе, который сделает весь необходимый материал и более позднее требование конструктор и возвратит объект.

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);
    }
}
 armanali
armanali
Редактировал ответ 7-го апреля 2013 в 8:52
94
0
Janus Pedersen
Janus Pedersen
11-го ноября 2013 в 11:32
2013-11-11T11:32:42+00:00
Дополнительно
Источник
Редактировать
#8415712

Это - истинное использование 'основа' (что-то), чтобы вызвать конструктора базового класса, но в случае перегрузки использования 'это' ключевое слово

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
 shA.t
shA.t
Редактировал ответ 9-го апреля 2018 в 11:46
33
0
 SnowBEE
SnowBEE
4-го декабря 2009 в 5:03
2009-12-04T05:03:34+00:00
Дополнительно
Источник
Редактировать
#8415708
public class MyExceptionClass : Exception
{
    public MyExceptionClass(string message,
      Exception innerException): base(message, innerException)
    {
        //other stuff here
    }
}

Вы можете передать внутреннее исключение в один из конструкторов.

26
0
 Fab
Fab
24-го января 2016 в 7:34
2016-01-24T07:34:21+00:00
Дополнительно
Источник
Редактировать
#8415715

От [Руководство по проектированию Структуры] [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

19
0
 wchoward
wchoward
27-го мая 2016 в 9:27
2016-05-27T21:27:43+00:00
Дополнительно
Источник
Редактировать
#8415717

Вы можете также сделать условную проверку с параметрами в конструкторе, который позволяет некоторую гибкость.

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

или

public MyClass(object myObject=null): base(myObject==null ? new myOtherObject(): myObject)
{
}
 wchoward
wchoward
Редактировал ответ 11-го июня 2018 в 10:47
15
0
 CShark
CShark
14-го марта 2017 в 12:38
2017-03-14T12:38:53+00:00
Дополнительно
Источник
Редактировать
#8415718

Согласно некоторым из других ответов, перечисленных здесь, Вы можете передать параметры в конструктора базового класса. Рекомендуется вызвать Вашего конструктора базового класса в начале конструктора для Вашего унаследованного класса.

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}")
    {
    }
}
 CShark
CShark
Редактировал ответ 19-го марта 2019 в 6:31
8
0
 Tutankhamen
Tutankhamen
26-го февраля 2015 в 4:11
2015-02-26T04:11:37+00:00
Дополнительно
Источник
Редактировать
#8415714
class Exception
{
     public Exception(string message)
     {
         [...]
     }
}

class MyExceptionClass : Exception
{
     public MyExceptionClass(string message, string extraInfo)
     : base(message)
     {
         [...]
     }
}
8
0
Donat Sasin
Donat Sasin
7-го апреля 2016 в 12:06
2016-04-07T12:06:09+00:00
Дополнительно
Источник
Редактировать
#8415716
public class MyException : Exception
{
    public MyException() { }
    public MyException(string msg) : base(msg) { }
    public MyException(string msg, Exception inner) : base(msg, inner) { }
}
Donat Sasin
Donat Sasin
Редактировал ответ 22-го марта 2017 в 1:10
7
0
Похожие сообщества 6
Microsoft Stack Jobs
Microsoft Stack Jobs
2 414 пользователей
Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks
Открыть telegram
С#
С#
2 330 пользователей
Стараемся не флудить. Пишем по делу. Правила: https://t.me/professorweb/430450 Для флуда @svoboda_obsh
Открыть telegram
CODE BLOG / C#
CODE BLOG / C#
1 763 пользователей
Чат для .NET разработчиков и C# программистов. По всем вопросам: @shwanoff Youtube-канал: https://youtube.com/codeblog Основной канал: @codeblog Вконтакте: https://vk.com/codeblog Правила: https://t.me/codeblog_csharp/246972 Вакансии по тегу #work
Открыть telegram
var chat = new Chat();
var chat = new Chat();
1 428 пользователей
Обсуждение вопросов по .NET Правила чата – https://blog.devdigest.today/chat-rules Чат для флуда – https://t.me/+zwxI91RGG6s2YzAy
Открыть telegram
C#/.NET Для Новичков
C#/.NET Для Новичков
293 пользователей
Группа создана для тех, кто изучает язык программирования C#. Верховный главнокомандующий: @BlackDeveloper Оффтоп - разрешен в меру, реклама - бан.
Открыть telegram
ext
ext
31 пользователей
Общение на темы YouTube канала и программирования. Вакансии не размещаем. Основной канал: @extremecode
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 1 день назад
2
Денис Васьков
Зарегистрирован 2 дня назад
3
Dima Patrushev
Зарегистрирован 5 дней назад
4
sirojidddin otaboyev
Зарегистрирован 1 неделю назад
5
Елена Гайдамамакинат
Зарегистрирован 1 неделю назад
DA
DE
EL
ES
FR
ID
IT
JA
KO
LT
NL
PT
RO
RU
TR
ZH
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией