Почему я не могу создать абстрактного конструктора на абстрактном классе C#?

Вы должны изменить код вашей серверной части, как указано ниже

public class CorsResponseFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext,   ContainerResponseContext responseContext)
    throws IOException {
        responseContext.getHeaders().add("Access-Control-Allow-Origin","*");
        responseContext.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");

  }
}
58
задан Anthony D 3 February 2009 в 18:39
поделиться

6 ответов

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

, Если Вы думаете об этом, это имеет смысл, так как Вы всегда вызываете конструктора дочернего класса (с новым оператором) и никогда базовый класс.

Вообще говоря, единственный путь в C# для осуществления определенной подписи конструктора при помощи новый () универсальное ограничение, которое осуществляет существование конструктора без параметров для параметра типа.

51
ответ дан Tamas Czinege 7 November 2019 в 15:30
поделиться

Изменение, что конструктор в классе A к

protected A(int a, int b)
{
    // Some initialisation code here
}

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

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

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

26
ответ дан Jamie Penney 7 November 2019 в 15:30
поделиться

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

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

4
ответ дан devio 7 November 2019 в 15:30
поделиться

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

Однако: возможно, добавляя более конкретный пример проблемы Вы имеете, мог бы запросить другие/лучше ответы. Вы ищете некоторый универсальный код инстанцирования, или Вы обеспокоены, что определенные настройки на абстрактном базовом классе должны быть сделаны?

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

0
ответ дан Simon Groenewolt 7 November 2019 в 15:30
поделиться

не уверен если это поможет - но я считаю, что это было бы решением вашей проблемы:

public class A
{
  public A(int a, int b)
  {
    DoSomething(int a, int b);
  }

  virtual public void DoSomething(int a, int b)
  {

  }
}

public class B : A
{
  override public void DoSomething(int a, int b)
  {
    //class specific stuff
  }
}

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

0
ответ дан 24 November 2019 в 18:26
поделиться

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

public abstract class A 
{ 
    abstract A MakeAInstance(int a, int b); 
} 

public class B : A 
{ 
    // Must implement:
    override A MakeAInstance(int a, int b) {
        // Awesome way to create a B instance goes here
    }
} 
7
ответ дан 24 November 2019 в 18:26
поделиться
Другие вопросы по тегам:

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