2010-04-11 2 views
2
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; 
} 

Два вопроса:Базовый класс с абстрактными подклассами в C#?

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

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

+0

Хм ... Я не знаю, как правильно сформулировать вопрос –

+0

Я с тобой на # 2. Можете ли вы объяснить № 1 немного больше? Вы пытаетесь оставить закрытое до закрытия, но открытое для расширения? –

+0

Если это для обработки JSON, как вы описали ниже, почему бы вообще не иметь строго типизированный объект Parameters? Просто вставьте все параметры в IDictionary. Параметры - это просто объект передачи данных, так как он не будет иметь никакого поведения. –

ответ

7

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

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

, а затем вы можете сделать это:

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

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

+0

Внедрение связи JSON. Я бы хотел, чтобы это можно было сделать с помощью массивов. Grrrrr ....Я ненавижу это - у меня есть около 20 классов для каждого запроса и еще 20 для соответствующих ответов :( –

+0

Вы можете использовать что-то вроде JSon.Net? – flq

+0

Я использую JSON.NET - я сериализую объекты JSON в классы –

1

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

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

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

1

Конструкторы могут быть соединены с синтаксисом

ctor() : this() 

или

ctor() : base() 

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

Сделать поле Параметры родовое

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

class Specialized : Request<SpecialParameters> { 
} 

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

Смежные вопросы