我有以下代码:
public Abstract class BaseClass
{
public int BaseProperty {get; set;}
}
public class ChildClass : BaseClass
{
public int ChildProperty {get; set;}
}
public class test
{
public test()
{
ChildObject = new ChildClass ();
}
public ChildClass ChildObject {get; set;}
}
在课程test
中,我想访问基类的BaseProperty
属性,ChildObject.BaseProperty
无法正常工作,如果我做了
int num = (ChildObject as BaseClass).BaseProperty ;
发生转换错误。
有什么想法吗?
答案 0 :(得分:1)
只需使用b.P1
即可。 (为方便起见,这里是DotNetFiddle,因为我一直都是为了方便。)
可以这样想:B
继承自A
。因此即使P1
在技术上属于A
的属性,B
也具有该属性,因为它继承自A
。您始终可以将B
的实例视为A
的实例。
附注 - 我注意到,如果我们避免使用A
,B
,BaseClass
,{{等名称,则问题和答案都会更容易阅读1}}等等。
所以这里使用一些更详细的例子进行相同的解释。 "车载"严重过度使用,但无论如何我都会使用它。
InheritedClass
如果您创建public class Vehicle
{
public int NumberOfDoors {get;set;}
}
public class Truck : Vehicle
{
public int NumberOfCountryMusicianEndorsements {get;set;}
}
Truck
您可以将其转换为var truck = new Truck();
Vehicle
但您不需要,因为var vehicle = (truck);
var numberOfDoors = vehicle.NumberOfDoors;
已经是vehicle
,因为Vehicle
继承自Truck
。因此Vehicle
具有与Truck
及其自身相同的属性。
Vehicle
这个甚至是一个奇特的术语 - 它被称为Liskov替代原则。简而言之,这意味着如果var numberOfDoors = truck.NumberOfDoors;
继承自Truck
,那么您应始终能够使用Vehicle
作为Truck
。您始终可以将继承的类替换为其任何一个基类。 (这并非总是如此。有时你不能。这意味着有人做错了。这个原则意味着你应该总是能够做到。)
答案 1 :(得分:0)
我认为您有一个可变拼写错误,在A中您使用大写字母定义P1
而在B中您使用小写字母定义p2
,在命名和访问b.p1
时将保持一致工作