DevinB
DevinB

Reputation: 8316

Overriding (cast)

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

Upvotes: 14

Views: 17875

Answers (2)

Daniel Br&#252;ckner
Daniel Br&#252;ckner

Reputation: 59645

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;

Upvotes: 31

mqp
mqp

Reputation: 71937

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.

Upvotes: 2

Related Questions