【发布时间】:2020-12-02 05:12:00
【问题描述】:
我正在开发一个模型,它可以用一堆不同的车辆来做一些事情。 每辆车都应该做一些事情,但每种车辆类型做不同的事情。 所以我以这种方式实现了它,使用 .NET Framework:
abstract class Vehicle
{
abstract void DoStuff()
}
class Car : Vehicle
{
override void DoStuff()
{
//Do some Car stuff here
}
}
class Motorcycle : Vehicle
{
override void DoStuff()
{
//Do some Motorcycle stuff here
}
}
class Model
{
RunModel(Vehicle[] vehicleCollection)
{
foreach(Vehicle currentVehicle in vehicleCollection)
{
currentVehicle.DoStuff()
}
}
}
这是我的程序的核心功能,它按预期工作。 现在我应该根据每辆车所做的事情输出报告。每种类型的车辆都应该输出不同类型的报告,所以我为它做了一个类似的解决方案:
abstract class Vehicle
{
abstract void DoStuff();
abstract Report GetReport();
}
class Car : Vehicle
{
override Report GetReport()
{
return new CarReport(this);
}
}
class Motorcycle : Vehicle
{
override Report GetReport()
{
return new MotorcycleReport(this);
}
}
abstract class Report
{
int Foo {get; set;}
Report (Vehicle _vehicle)
{
Foo = _vehicle.CommonProperty;
}
}
class CarReport : Report
{
string Bar {get; set;}
CarReport(Car _car) : base(_car)
{
Bar = _car.CarPropoerty;
}
}
class MotorcycleReport : Report
{
bool Baz {get; set;}
MotorcycleReport(Motorcycle _cycle) : base(_cycle)
{
Baz= _cycle.MotorcyclePropoerty;
}
}
class Model
{
RunModel(Vehicle[] vehicleCollection)
{
foreach(Vehicle currentVehicle in vehicleCollection)
{
currentVehicle.DoStuff()
currentVehicle.GetReport()
}
}
}
这也可以正常工作,但问题是 Car 和 Motorcycle 现在依赖于 CarReport 和 MotorcycleReport。由于这是我的程序的非核心功能,并且报告结构在未来版本中可能会发生很大变化,我想以报告依赖于车辆的方式实现它,但车辆不依赖于报告。
我尝试了一种外部重载方法,该方法可以获取 Vehicle 并输出正确的报告 或将抽象报告(或接口 IReport)传递给 Vehicle “GetReport” 方法 但由于我的 RunModel 方法不知道它正在处理什么类型的 Vehicle,我找不到将其映射到正确报告类型的方法。
有没有办法避免这种双向依赖?
【问题讨论】:
-
你在这里使用 .NET Core 还是 .NET Framework?而且我假设您提供的 sn-p 中带有
MotorcycleReport的构造函数是错字吗? -
感谢您的评论和编辑。确实是 MotorcycleReport 在那一行。我正在使用 .NET Framework,我会将其添加到帖子中!
-
在我的回答中添加了一种从
Vehicle中完全删除Report依赖项的方法,请看看它是否是您所需要的
标签: c# dependencies polymorphism