Базовый класс с абстрактными подклассами в C #? - PullRequest
2 голосов
/ 12 апреля 2010
public abstract class Request
{
   public class Parameters
   {
       //Threre are no members here
       //But there should be in inherited classes
   }

   public Request()
   {
       parameters = new Parameters();
   }

   public Parameters parameters;
}

Два вопроса:

  1. Как мне сделать так, чтобы я мог добавлять вещи в конструктор , но оригинальный конструктор все равно будет выполнен?

  2. Как мне сделать так, чтобы подклассы могли добавлять членов в Параметры класс?

Ответы [ 3 ]

7 голосов
/ 12 апреля 2010

Если вы делаете то, что я думаю, вам придется немного изменить конструктор:

public Request(Parameters parameters) {
  this.Parameters = parameters;
}

и тогда вы можете сделать это:

public class SpecificRequest : Request {
  public class SpecificRequestParameters : Request.Parameters {
  }
  public SpecificRequest() : base(new SpecificRequestParameters()) {
    //More stuff here
  }
}

Какую конкретную проблему вы пытаетесь решить? То, что вы здесь делаете, кажется довольно неловким и чрезмерно сложным.

1 голос
/ 12 апреля 2010

Конструкторы могут быть связаны с синтаксисом

ctor() : this()

или

ctor() : base()

там вы можете передавать параметры и т. Д.

Сделать поле параметров универсальным

abstract class Request<T> where T : Parameters {
  T Parameters;
}

class Specialized : Request<SpecialParameters> {
}

, где SpecialParameters наследуется от Parameters.

1 голос
/ 12 апреля 2010

Почему вы встраиваете класс Parameters в класс Request? Вместо этого пусть Request имеет экземпляр параметров и просто объявляет класс где-то еще.

Ответ на свой вопрос 1: Наследовать от Request и конструктор исходного запроса будет вызываться всегда.

Вопрос 2: Подклассы не могут добавлять членов в классы параметров (кроме как с отражением, но вы не хотите идти по этому пути). Лучшее, что вы можете сделать, это наследовать от параметра, и InheritedRequest использует класс InheritedParameter. Обратите внимание, что в этом случае вы не можете переопределить свойства и свойства. У вас должно быть дополнительное свойство в InheritedRequest, называемое AdditionalParameters типа InheritedParameters.

...