2011-01-31 3 views
3

Ниже приведен код ошибки. Пожалуйста, помогите мне достичь того, чего я пытаюсь достичь, но с хорошим кодом. Я хочу иметь массив объектов, который получен из базы. Я хочу иметь возможность использовать этот массив в BaseClass при запуске DoStuff(). Я знаю, что я не могу унывать, это не то, что я ищу здесь. Я просто хочу иметь возможность устанавливать поля в производном классе и использовать поля в базе DoStuff().Невозможно переопределить базовое свойство

public class BaseObject 
{ 

} 

public class DerivedObject : BaseObject 
{ 

} 

public class BaseClass 
{ 
    public BaseObject[] Objects; 

    public virtual void DoStuff() 
    { 
     // use the Objects 
    } 
} 

public class DerivedClass : BaseClass 
{ 
    public override DerivedObject[] Objects; 

    public override void DoStuff() 
    { 
     // Do stuff unique to the derived. 

     base.DoStuff(); 
    } 
} 

ответ

9

Вы ищете дженерики?

public class BaseClass<T> 
where T : BaseObject 
{ 
    public T[] Objects; 

    public virtual void DoStuff() 
    { 
     // use the Objects 
    } 
} 

public class DerivedClass : BaseClass<DerivedObject> 
{ 
    public override void DoStuff() 
    { 
     // Do stuff unique to the derived. 

     base.DoStuff(); 
    } 
} 

В приведенном выше поле кода T типа (общий или параметр типа) объявлен, T ограничивается, чтобы быть BaseObject или класс, унаследованный от BaseObject, когда DerivedClass объявлен DerivedObject задается в месте Т, так что в DerivedClassObjects поле может использоваться как DerivedObject[].

+0

Возможно, но это кажется излишним. – Matthew

+0

Теперь, когда я смотрю на него, это, вероятно, лучше всего работает. Я попробую. – Matthew

+0

@Matthew: в другом случае вам нужно будет поместить поле объектов в DerivedClass. –

0

Вы правильно определения собственности, он должен выглядеть

public class BaseClass 
{ 
    public virtual BaseObject[] Objects {get; set;} 

    public virtual void DoStuff() 
    { 
     // use the Objects 
    } 
} 

Тогда вы должны быть в состоянии изменить его, как

public class DerivedClass : BaseClass 
{ 
    public override BaseObject[] Objects {get; set;} 

    public override void DoStuff() 
    { 
     // Do stuff unique to the derived. 

     base.DoStuff(); 
    } 
} 

Он должен иметь такое же имя в качестве базового объекта.

+0

В чем смысл переопределения здесь, если вы не измените реализацию? – siride

+1

Я не хочу, чтобы DerivedClass содержал массив BaseObjects. Я хочу, чтобы он содержал массив DerivedObjects (который расширяет BaseObject). – Matthew

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