Абстрактный конструктор в C# [дубликат]

Возможный дубликат:
Почему я не могу создать абстрактного конструктора на абстрактном классе C#?

Почему я не могу объявить краткий обзор конструктор моего класса как это:

public abstract class MyClass {
    public abstract MyClass(int param);
}
46
задан Community 23 May 2017 в 12:02
поделиться

8 ответов

Конструкторы применимы только к тому классу, в котором они определены, то есть они не наследуются. Конструкторы базового класса используются (вы должны вызвать один из них, даже если вызываете только конструктор по умолчанию автоматически), но не переопределяются путем создания классов. Вы можете определить конструктор в абстрактном базовом классе - он не может использоваться напрямую, но может быть вызван производными классами. Что вы не можете сделать, так это заставить производный класс реализовать конкретную сигнатуру конструктора.

Совершенно разумно иметь конструктор, определенный, обычно как защищенный, для определения некоторого общего установочного кода для всех производных классов. Это особенно верно, возможно, когда абстрактный класс предоставляет какое-то другое поведение по умолчанию, которое зависит от этой настройки. Например:

public abstract class Foo
{
     public string Name { get; private set; }

     protected Foo( string name )
     {
         this.Name = name;
     }
}

public class Bar : Foo
{
     public Bar() : base("bar")
     {
        ...
     }
}
72
ответ дан 26 November 2019 в 20:17
поделиться

Конструкторы ближе к статическим методам, чем к «обычным» методам. Как и статические методы, они могут быть перегружены , но не . То есть они не наследуются, но могут быть переопределены.

public BaseClass
{
   public BaseClass( String s ) { ... }
   public static void doIt ( String s ) { ... }
}

public SubClass extends BaseClass
{
   public SubClass( String s )  { ... }
   public static void doIt ( String s ) { ... }
}

public SubClass2 extends BaseClass
{
}

new SubClass( "hello" );
SubClass.doIt( "hello" ); 

new SubClass2( "hello" ); // NOK
SubClass2.doIt( "hello" ); // NOK

Конструкторы и статические методы никогда не отправляются динамически (виртуально) - вы всегда знаете конкретный тип, который вы создаете, или конкретный класс статического метода. Поэтому нет смысла иметь абстрактный конструктор и абстрактный статический метод . Вот почему вы также не можете указывать конструктор и статический метод в интерфейсах .

Вы даже можете думать о конструкторе как о статическом фабричном методе (и смотрите соответствующий шаблон ):

  MyClass obj = new MyClass(); // the way it is
  MyClass obj = MyClass.new(); // think of it like this

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

Примечание : в таких языках, как Smalltalk, где классы являются обычными объектами, вы можете переопределить статический метод и иметь абстрактный конструктор. Но это не относится к Java, потому что классы не являются «обычными» объектами, даже если вы можете получить их с помощью отражения.

7
ответ дан 26 November 2019 в 20:17
поделиться

Абстрактный подразумевает виртуальный. Конструктор не по умолчанию никогда не может быть вызван полиморфно, поэтому virtual и abstract не разрешены для конструкторов.

ЕСЛИ в будущей версии C# дженерики будут усовершенствованы и позволят вызывать конструкторы не по умолчанию через параметр дженерикового типа, то полиморфные вызовы конструкторов станут возможными, и виртуальные и абстрактные конструкторы также могут быть добавлены.

6
ответ дан 26 November 2019 в 20:17
поделиться

Что в этом плохого:

public abstract class MyClass {
    protected MyClass(int param)
    {
    }
}

В этом случае вы обязываете все производные классы вызывать конструктор базового класса.

4
ответ дан 26 November 2019 в 20:17
поделиться

Потому что абстрактные конструкторы не поддерживаются.

Но абстрактный класс может иметь конструктор.

3
ответ дан 26 November 2019 в 20:17
поделиться

Конструктор - это не обычный метод. Он имеет особое назначение и поэтому ограничен языковыми функциями, которые имеют смысл для этой цели. См. Также: Почему конструкторы не возвращают значения?

1
ответ дан 26 November 2019 в 20:17
поделиться

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

12
ответ дан 26 November 2019 в 20:17
поделиться

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

0
ответ дан 26 November 2019 в 20:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: