c# - 如何使用特殊对象列表作为从 C# 中的同一类继承的类型的实例?
问题描述
假设我有从 Vehicle 继承的 Bus 和 Truck 类:
class Vehicle
{
public string Model { get; set; }
}
class Bus : Vehicle
{
public Bus(string model, int passengers)
{
Model = model;
MaxPassengers = passengers;
}
public int MaxPassengers { get; set; }
}
class Truck : Vehicle
{
public Truck(string model, int weight)
{
Model = model;
MaxWeight = weight;
}
public int MaxWeight { get; set; }
}
话虽如此,我希望允许用户创建新的卡车或巴士类并希望保存它们。我能想到的最好方法是制作一个列表,但我必须让它同时接受 Truck 和 Bus 对象。
起初我想制作一个车辆清单。这就是我想出的:
class Program
{
static void Main(string[] args)
{
List<Vehicle> allVehicles = new List<Vehicle>();
Console.Write("[Bus] Insert model: ");
string busModel = Console.ReadLine();
Console.Write("[Bus] Insert max passengers: ");
int busPassengers = Convert.ToInt32(Console.ReadLine());
Console.Write("[Truck] Insert model: ");
string truckModel = Console.ReadLine();
Console.Write("[Truck] Insert weight capacity: ");
int truckWeight = Convert.ToInt32(Console.ReadLine());
allVehicles.Add(new Bus(busModel, busPassengers));
allVehicles.Add(new Truck(truckModel, truckWeight));
}
}
上面的代码可以编译,但我无法访问它们的特定属性(Bus 对象的 MaxPassengers 和 Truck 对象的 MaxWeight)。铸造似乎也不起作用。以下语句无法编译:
Console.WriteLine((Bus)allVehicles[0].MaxPassengers);
我错过了什么吗?我必须为每个班级列出一份清单吗?
解决方案
提供的代码一切都很好而且很干净。
您只需要为演员添加括号,否则它会尝试转换MaxPassengers
并且失败:
if ( allVehicles[0] is Bus )
Console.WriteLine(((Bus)allVehicles[0]).MaxPassengers);
或显式转换:
if ( allVehicles[0] is Bus )
Console.WriteLine((allVehicles[0] as Bus).MaxPassengers);
空条件运算符也可以用来避免 if:
Console.WriteLine((allVehicles[0] as Bus)?.MaxPassengers);
您还可以在 C# 7+中使用模式匹配:
if ( allVehicles[0] is Bus bus)
Console.WriteLine(bus.MaxPassengers);
您也可以过滤集合:
using System.Linq;
var allBus = allVehicles.OfType<Bus>();
foreach ( var bus in allBus )
Console.WriteLine(bus.MaxPassengers);
推荐阅读
- database - MS Access 数据库设计
- reactjs - 如何通过组件编辑存储中的数据?反应 JS
- facebook - 页面的full_picture参数
- jquery - 如何在 jquery 中使用动态规则验证
- java - 代码部署到服务器后无法访问本地网络摄像头
- android - 如何在不建立网站的情况下生成链接并导航到应用程序
- dart - 使用“webdev build”时如何启用源映射生成?
- vue.js - 如何使用nuxt js中的所有页面制作压缩的js文件
- python - 对于类的两个不同实例,内存中的相同列表地址
- python - 抓取 Div 类 HTML 时如何在 For 循环中嵌套 If 语句