如何从子类C的实例访问基类属性#

时间:2016-06-22 16:51:24

标签: c# inheritance parent-child

我有以下代码:

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 ; 

发生转换错误。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

只需使用b.P1即可。 (为方便起见,这里是DotNetFiddle,因为我一直都是为了方便。)

可以这样想:B继承自A。因此即使P1在技术上属于A的属性,B也具有该属性,因为它继承自A。您始终可以将B的实例视为A的实例。

附注 - 我注意到,如果我们避免使用ABBaseClass,{{等名称,则问题和答案都会更容易阅读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时将保持一致工作