C# 我有一个超类对象数组,其中可能包含子类对象.如何测试子类对象并使用它的访问器

本文关键字:对象 子类 测试 访问 何测试 数组 超类 包含 有一个 | 更新日期: 2023-09-27 18:33:35

我有一个AutoMobilesArray此数组可能包含子类对象TruckCar

如何测试数组中对象类型的位置?例如:

if(AutoMobileArray[1].IsObject(Car)){}

Car类具有唯一的访问器

public String BootSpace()

如何使用子类对象访问器?例如:

if(AutoMobileArray[1].IsObject(Car))
{
    BootSpaceLabel.Text = AutoMobileArray[1].BootSpace();
}

C# 我有一个超类对象数组,其中可能包含子类对象.如何测试子类对象并使用它的访问器

好吧

,如果我理解正确的话,有is运算符:

if(AutoMobileArray[1] is Car)
{
  //Do stuff here
}
要使用子类

(在子类中定义的访问方法等)执行操作,您需要强制转换:

if(AutoMobileArray[1] is Car)
{
  Car c = (Car)AutoMobileArray[1];
}
if(AutoMobileArray[1] is Car){ }

is运算符:http://msdn.microsoft.com/en-US/library/scekt9xw(v=vs.71).aspx

然后,可以强制转换为适当的类型:

if(AutoMobileArray[1] is Car)
{
    Car car = (Car)AutoMobileArray[1];
    BootSpaceLabel.Text = car.BootSpace();
}
Car car = AutoMobileArray[1] as Car;
if(car != null)
{
    BootSpaceLabel.Text = car.BootSpace();
}

你可以简单地使用这样的表达式:

if (AutoMobileArray[1] is Car)
{
    BootSpaceLabel.Text = AutoMobileArray[1].BootSpace();
}

尽管有一些解决方法可以不使用"is"关键字,例如,您可以在类AutoMobile定义方法,如下所示:

virtual string BootSpace()
{ 
    return string.Empty; 
}

abstract string BootSpace();

并在 Car 子类(和其他子类,根据 yout 业务逻辑)中override此方法:

override string BootSpace()
{
    //Car bootspace logic here 
}

之后,您可以简单地调用BootSpaceLabel.Text = AutoMobileArray[1].BootSpace();而无需检查对象类型;

处理这个问题的更高级和"漂亮"的方法是使用"设计模式"。有许多标准设计问题可以有效解决。它们被称为设计模式。在您的情况下,策略模式可能很有用。http://en.wikipedia.org/wiki/Strategy_pattern