Reputation: 4301
Public class ClassB : ClassA
{
}
public class GeneralClass
{
public ClassA test
{
get{}
set{}
}
}
public class specificClass :GeneralClass
{
public ClassB test
{
get{}
set{}
}
}
As you can see the property test is inherited in specificClass from generalClass but here I want to change the type to ClassB (ClassB:ClassA
) . can I do something like this so anytime I'm using the specializedClass.test
I don't need to typecast it to classB ?
edit 1 : I forgot to mention that now it's giving me the warning that test hide inherited member test .use new keyword if hiding is intended .
Upvotes: 0
Views: 358
Reputation: 715
Depending on your exact problem you can solve it with generics. (But it's kind of complicated)
Note: GeneralClass : AbstractGeneralClass
and SpecificClass : AbstractGeneralClass
You can:
GeneralClass
and SpecificClass
in AbstractGeneralClass
testAsClassA
if you have a variable of type AbstractGeneralClass
ClassB test
if you have a variable of type SpecificClass
class ClassA { }
class ClassB : ClassA { }
abstract class AbstractGeneralClass
{
/* functionality that does not depend on test */
public abstract ClassA testAsClassA { get; }
}
abstract class AbstractGeneralClass : AbstractGeneralClass where T : ClassA
{
T myProperty;
public T test
{
get { return myProperty; }
set { myProperty = value; }
}
public override ClassA testAsClassA { get { return myProperty; } }
}
class GeneralClass : AbstractGeneralClass { }
class SpecificClass : AbstractGeneralClass { }
Upvotes: 0
Reputation: 421960
You can't modify the return type as you override methods and properties. C# doesn't support return type covariance.
By the way, if you don't need to override the property and just want to return the base value casted to some specific type, you can declare a new
property to hide the base class one. Note that it's not return type covariance. It's just a distinct property that happens to have an identical name:
public new ClassB test {
get { return base.test as ClassB; }
set { base.test = value; }
}
Upvotes: 6
Reputation: 3234
Mehrdad Afshari just updated his question to reflect what I was about to write. Basically, what you're looking for is:
public class ClassA
{
}
public class ClassB : ClassA
{
}
public class GeneralClass
{
public ClassA myClass { get; set; }
}
public class SpecificClass : GeneralClass
{
new public ClassB myClass { get; set; }
}
public myFunction()
{
var sc = new SpecificClass();
sc.myClass = new ClassB();
Console.WriteLine("sc.GetType() = " + sc.myClass.GetType());
var gc = (GeneralClass)sc;
gc.myClass = new ClassA();
Console.WriteLine("gc.GetType() = " + gc.myClass.GetType());
Console.WriteLine("sc.GetType() = " + sc.myClass.GetType());
}
Upvotes: 0
Reputation: 46098
When overridding methods and properties, you have to use the exact same types as the base method/property, even when it may be safe to use a subclass. You can hide properties using the new
keyword, but it won't be virtually dispatched when it is called on the base class.
Upvotes: 0