2009-04-07 3 views
9

Если у меня есть базовый класс и два производных класса, и я хочу реализовать кастинг между двумя производными классами вручную, есть ли способ сделать это? (В C#)Overriding (cast)

abstract class AbsBase 
{ 
    private int A; 
    private int B; 
    private int C; 
    private int D; 
} 

class Imp_A : AbsBase 
{ 
    private List<int> E; 
} 


class Imp_B : AbsBase 
{ 
    private int lastE; 
} 

Вообще-то я буду литье из Imp_A -> Imp_B, и я хочу, чтобы последнее значение в списке E, чтобы быть «LASTE». Также, если были три или более класса реализации (например, зарплата, почасовая оплата, консультант и бывшие сотрудники).

Независимо от того, является ли это архитектурно обоснованным (я не могу описать все приложение и быть кратким) Является ли это возможным?

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

-Devin

ответ

19

Необходимо выполнить оператор или implicit.

class Imp_A : AbsBase 
{ 
    public static explicit operator Imp_B(Imp_A a) 
    { 
     Imp_B b = new Imp_B(); 

     // Do things with b 

     return b; 
    } 
} 

Теперь вы можете сделать следующее.

Imp_A a = new Imp_A(); 
Imp_B b = (Imp_B) a; 
+1

Имейте в виду, что это (очевидно) действительно создаст целый новый объект Imp_B. – mquander

+0

Это прекрасно. Но, как отмечает г-н Маккандер, это новый объект, который, я считаю, неизбежен. Но означает ли это, что «а» не будет GC'd, пока он не выпадет из сферы действия, хотя я никогда больше его не использую (как Imp_A)? – DevinB

+0

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

2

Я предлагаю вам написать Imp_B, как это, если это возможно:

class Imp_B : Imp_A 
{ 
    private int A; 
    private int B; 
    private int C; 
    private int D; 
    private int lastE { get { return this.E.Last(); } } 
} 

Если вы не можете на самом деле происходят из ИМПБ, это невозможно для вас «лечить» в ИТПМ объект как ImpB прозрачно, как вы хотите, потому что они просто не то же самое в памяти. Итак, выполните явное преобразование.

+0

извините, вы правы, я удалю A-D – DevinB

+0

Кроме того, эти классы будут гораздо более сложным, с некоторыми переменными, которые являются исключительными для каждого из них. А затем некоторые переменные (например, E), которые напрямую связаны, но не обязательно одинаковы. – DevinB