2016-06-17 3 views
0

У меня есть следующие классы. Для каждого из классов управления я хотел бы предоставить элемент данных через свойство.C# производные классы и свойства

public class BasicData {} 
public class AdvancedData : BasicData { } 

public class BasicControl 
{ 
    private BasicData data; 

    public BasicData DataHide; 

    public virtual BasicData DataOverride; 
} 

public class AdvancedControl: BasicControl 
{ 
    private AdvancedData data; 

    public new AdvancedData DataHide; //Hide 

    public override BasicData DataOverride; //Override 
} 

Если я свойство виртуальной, то мой AdvancedControl класс должен выставить данные в BasicData и не AdvancedData (который я предпочел бы).

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

Я хочу иметь только одно свойство данных для каждого класса управления, и я хочу, чтобы это свойство имело одно и то же имя в каждом классе, то есть Data. Для BasicControl это должно быть BasicData. Для AdvancedControl это должно быть AdvancedData.

Каков наилучший способ разработки моих классов для достижения этого?

+0

Не можете ли вы использовать дженерики? 'BasicControl где TData: BasicData'? – Toxantron

+0

Я бы использовал generics, у которых есть только 'Control , где T: BasicData' и имеют' Data' как 'частные данные T ';'. 'AdvancedControl' тогда будет' class AdvancedControl: Control ' –

+4

http://stackoverflow.com/questions/5709034/does-c-sharp-support-return-type-covariance –

ответ

1

Вы можете использовать общий подход:

public class BasicData {} 
public class AdvancedData : BasicData { } 

public class BasiccControl<T> where T : BasicData 
{ 
    private T data; 
    public T Data; 
} 

public class AdvancedControl : BasicControl<AdvancedData> 
{ 
}  

Так что вам не нужно переопределить или скрыть элементы в каждом производном и по-прежнему имеет типовую безопасность (до тех пор, пока вы предоставляете правильные общие аргументы T).