2016-01-17 2 views
0

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

public class Base{ 
    private string name = string.Empty(); 

    public Base(string name){ 
     this.name = name; 
    } 

    public string Name{get;set;} 
} 

и у меня есть общий класс, который наследует от Base класса, а также содержит метод, который возвращает объект общего типа T так:

public SubClass<T>:Base{ 
    public SubClass(string name):base(name){} 

    public T method(string parameter){ 
     //do some stuff here and return T 
     return T; 
    } 
} 

и я создать экземпляр объекта в SubClass:

object instance = new SubClass<object>("name"); 

и я не использую общий тип в конструкторе. параметры в конструкторе SubClass являются предопределенными типами (например, string, int и т. д.). Эта реализация отлично работает, но мне интересно, правильно ли это? есть еще один подходящий способ сделать это. Thanx

Edit

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

+0

Вы определили подкласс и это конструктор правильно. И вы указываете «объект» как общий тип при создании экземпляра. Но почему вы храните экземпляр как объект? Какой смысл создавать общий тип, если вы укажете объект? Чего вы на самом деле пытаетесь достичь? –

ответ

0

Я немного озадачен, глядя на ваш код. Почему вы сохраняете свой экземпляр SubClass в объекте? Таким образом вы не сможете ссылаться на каких-либо членов вашего класса (другие, чем унаследованные от System.Object).

Я хочу также, чтобы обеспечить модель (например, модель счета, модель продукта) , что я ожидаю от базы данных

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

public interface IModel 
{ 
    Foo GetFoo(); 
} 

public class AccountModel : IModel 
{ 
    public Foo GetFoo() 
    { 
     // whatever 
    } 
} 

public class ProductModel : IModel 
{ 
    public Foo GetFoo() 
    { 
     // whatever 
    } 
} 

Поскольку мы знаем, что параметр типа SubClass является IModel, было бы хорошей идеей, чтобы поместить ограничение типа на T:

public class SubClass<T> : Base where T : IModel 
{ 
    public SubClass(string name) : base(name){} 

    public T Method(string parameter) 
    { 
     //do some stuff here and return T 
     return T; 
    } 
} 

И я хотел бы использовать его как это:

SubClass<ProductModel> pm = new SubClass<ProductModel>("blurg"); 
IModel model = pm.Method(); 
Foo foo = model.GetFoo(); 
+0

Thanx для вашего времени вот несколько ответов: «Почему вы храните свой экземпляр SubClass в объекте»: это пример. Кто-то вызовет методы библиотеки, и он вернет экземпляр класса, который он передаст, например Account account = new SubClass («blurg»): «Я предполагаю, что эти разные типы моделей реализуют общий интерфейс»: вы не можете предположить, что это будет вне контроля библиотеки. – vbouk

+0

Даже если вы не можете предположить, что у вас есть изменение дизайна, как было предложено, вы должны хотя бы убедиться, что методы библиотеки возвращают * тип * вида * class *.Если это так, то вам не нужно беспокоиться, ваш текущий код в порядке и будет работать, как показано здесь, только с исключением, что параметр типа не будет ограничиваться моделью контракта «IModel», как в этом ответе. – niksofteng

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