Sebastian
Sebastian

Reputation: 4811

Accessing child class property

I have 2 classes which are inherited in this manner

public class PartsParent
{

}
public class PartsCar : PartsParent
{   
    public int WheelRadius { get; set; }       
    public int Price { get; set; }
}

public class PartsBike : PartsParent
{

    public int Length { get; set; }       
    public int Weight { get; set; }       
    public int Price { get; set; }
}

And i have a function that accepts the class PartsParent as parameter and how can i convert this as partsCar / as PartsBike inside the function and access properties like Price WheelRadius etc?

private int PriceCollection(PartsParent mainObject)
{

  int _price=0;
  mainObject.OfType(PartsCar).Price;// something similar?? 
  return _price;
}

Upvotes: 0

Views: 93

Answers (4)

AymenDaoudi
AymenDaoudi

Reputation: 8301

Well, you are trying to cast a parent type to a child type, that is not really possible, why ?

The answer is that the parent P you are trying to cast to child C1 can be actually and originally of type C2, so the cast would be invalid.

The best way to explain this is a phrase that I read somewhere here on stackoverflow

You can't cast a mammal into a dog - it might be a cat.

You can't cast a food into a sandwich - it might be a cheeseburger.

What you can do though to turn around this situation is something like this :

(mainObject is PartsCar) ? (PartsCar)mainObject : mainObject 

Which is equivalent to :

mainObject as PartsCar

Then access mainObject's cast result using the null coalescing operator (because if as fails, the cast result will be null instead of throwing an Exception).

The generic method OfType<T> that you tried to use is an extension method that can be used with objects of type IEnumerable<T'> , which I guess is not your case.

Upvotes: 2

Siamak Ferdos
Siamak Ferdos

Reputation: 3299

It's possible if you separate uncommon properties your code into block:

if (mainObject is PartsCar)
{
    //Seprated code for PartsCar
    // WheelRadius...
    //Price...
}
else if (mainObject.GetType() == typeof(PartsBike))
{
    //Seprated code for PartsBike 
    //Length
    //Weight
    //Price
}

Upvotes: 0

Chetan
Chetan

Reputation: 6891

You can use is keyword to check the type and as keyword to convert to the target child type as following.

 if (mainObject is PartsCar)
 {
     var partscar = mainObject as PartsCar;
     // Do logic related to car parts
 }
 else if (mainObject is PartsBike)
 {
     var partsbike = mainObject as PartsBike;
     // Do logic related to bike parts.
 }

Upvotes: 0

Ghasan غسان
Ghasan غسان

Reputation: 5857

The idea of inheritance is to group up what is common in a super class, and leave other specific details to sub-classes. So if a property, say Price, is excepted from all sub-classes, then it should be declared in the super class.

However, if you still want to use it this way, then what are you looking for is:

int _price = ((PartsCar)mainObject).Price;

However, what if the object was of some other class, say PartsGift that inherits from PartsParent, but does not have a price? Then it will crash.

You almost really need to check your design.

BTW, if you want to check if an object is really of a specific class, then you can use is.

int number = 1;
object numberObject = number;
bool isValid = numberObject is int; // true
isValid = numberObject is string; // false

Upvotes: 1

Related Questions