2011-01-17 2 views
1

У меня есть ситуация, когда у меня есть несколько классов, которые имеют что-то общее и что-то уникальное. Я хотел бы создать класс, который более строго типизирован, чем объект [], но может содержать любой из этих других классов.Как создать пользовательский класс типа объекта в C#?

Если у меня есть, например:

class MyType1 
{ 
    string common1; 
    string common2; 
    string type1unique1; 
    string type1unique2; 

    //Constructors Here 
} 

class MyType2 
{ 
    string common1; 
    string common2; 
    string type2unique1; 
    string type2unique2; 

    //Constructors Here 
} 

я хотел бы создать класс что-то вроде:

class MyObject 
{ 
    string common1; 
    string common2; 

    //Code Here 
} 

Так что я создаю что-то вроде:

Dictionary<int, MyObject> 

Это будет содержать либо MyType1, либо MyType2, но не строку или int или что-либо еще, что словарь будет удерживать. Сохраняемые там объекты MyObject должны быть готовы к переходу на MyType1 или MyType2 позже, чтобы получить доступ к уникальным атрибутам снизу.

Также было бы здорово, если бы я мог получить доступ к MyObject.common1 или MyObject.common2, не переделав его.

+2

Звучит как прекрасный план, но вы точно не задавали вопрос. –

+0

Что случилось со стандартным наследованием? – Cameron

+1

есть много вопросов, уже охватывающих это на StackOverflow, например, проверьте [этот поиск] (http://stackoverflow.com/search?q= [c% 23] + наследование + база + класс). Возьмите 10 минут, чтобы пройти и прочитать выбор этих вопросов. – slugster

ответ

14
public abstract class MyObject { 
protected string common1; 
protected string common2; 
} 

public class MyType1 : MyObject { 
string type1unique1; 
string type1unique2; 
} 

public class MyType2 : MyObject { 
string type2unique1; 
string type2unique2; 
} 

IDictionary<int, MyObject> objects = new Dictionary<int, MyObject>(); 
objects[1] = new MyType1(); 
objects[1].common1 
if(objects[1] is MyType1) { 
    ((MyType1)objects[1]).type1unique1 
} 
+0

Просто чтобы добавить к этому ответу ... подумайте об именовании 'MyObject' что-то вроде' MyBaseObject', а также подумайте над тем, чтобы сделать его абстрактным. – slugster

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