tags:

views:

115

answers:

2

If I have a base class and two derived classes, and I want to implement the casting between the two derived classes by hand, is there any way to do that? (in C#)

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;
}

Generally I'll be casting from Imp_A -> Imp_B and I want the last value in the E list to be the 'LastE'. Also, what if there were three or more implementation classes (such as Salary, Hourly, Consultant, and Former Employees.)

Regardless of whether this is architecturally sound (I can't describe the whole application and be concise) is it possible?

I was going to write a converter, except that to my understanding a converter will create a new object of the Imp_B class, which I don't need because the 'employee' will only be one of the options at any one time.

-Devin

+1  A: 

I'd suggest you write Imp_B like this, if possible:

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(); } }
}

If you can't actually derive from ImpB, it's impossible for you to "treat" a ImpA object as an ImpB transparently the way you'd like, because they just aren't the same thing in memory. So, implement an explicit conversion.

mquander
sorry, you're right, I'll remove A-D
Also, these classes will be much more complicated, with certain variables that are exclusive to each. And then certain variables (like E) which are directly related, but not necessarily the same.
+1  A: 

You must implement a explicit or implicit operator.

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;
   }
}

Now you can do the following.

Imp_A a = new Imp_A();
Imp_B b = (Imp_B) a;
Daniel Brückner
Keep in mind that this will (obviously) indeed create a whole new Imp_B object.
mquander
That's perfect. But, as mquander mentions, it's a new object, which I believe is unavoidable. But does this mean that "a" won't be GC'd until it falls out of scope, even though I never use it again (as an Imp_A)?
Yes, it will get collected only if it falls out of scope and you do no longer hold any references to it.
Daniel Brückner