2010-09-06 2 views

ответ

11

Вы просто использовать обычный (литой) оператор:

class HigherTypeInHierarchy {} 
class LowerTypeInHierarchy : HigherTypeInHierarchy {} 

var lowerTypeInHierarchy = new LowerTypeInHiearchy(); 

// OK downcast: 
HigherTypeInHierarchy someObject = lowerTypeInHierarchy; 
var okDowncast = (LowerTypeInHiearchy)someObject; // OK 

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

class AnotherLowerTypeInHierarchy : HigherTypeInHierarchy {} 
var anotherLowerTypeInHierarchy = new AnotherLowerTypeInHiearchy(); 

// Failing downcast: 
HigherTypeInHierarchy someObject = anotherLowerTypeInHierarchy; 
var failedDowncast = (LowerTypeInHiearchy)someObject; // Exception! 

Если вы просто хотите «попробовать-бросок» (то есть готовы справиться с ситуацией, когда тип вы пытаетесь обратное приведение в действительности не обозначенного типа, используйте в -cast вместо:

var lowerTypeInHiearchyOrNULL = someObject as LowerTypeInHiearchy; 

Downcasting, как правило, плохая идея, поскольку подразумевает знание типа вне системы типов. Предполагается, что операции над более высокими уровнями в иерархии будут одинаково работать для всех производных типов (см. Liskov substitution principle), но с помощью понижающего преобразования вы указываете противоположное требование о том, что тип является фактически определенным производным типом).

+0

где класс LowerTypeInHiearchy {/ * код * /} и класс HigherTypeInHierarchy: LowerTypeInHiearchy {/ * код * /} –

+0

@ralf Да, это должно быть указано, - пример отредактирован соответственно. – Cumbayah

3
Class Animal { } 

Class Dog : Animal { } 

Dog dog = new Dog(); 
Animal animal = dog; //upcasting 
Dog sameDog = (Dog)animal; //Downcasting 
Смежные вопросы