C# 我有一个超类对象数组,其中可能包含子类对象.如何测试子类对象并使用它的访问器
本文关键字:对象 子类 测试 访问 何测试 数组 超类 包含 有一个 | 更新日期: 2023-09-27 18:33:35
我有一个AutoMobiles
的Array
此数组可能包含子类对象Truck
或Car
。
如何测试数组中对象类型的位置?例如:
if(AutoMobileArray[1].IsObject(Car)){}
Car
类具有唯一的访问器
public String BootSpace()
如何使用子类对象访问器?例如:
if(AutoMobileArray[1].IsObject(Car))
{
BootSpaceLabel.Text = AutoMobileArray[1].BootSpace();
}
好吧
,如果我理解正确的话,有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