努力完成一项旨在将 C++ 中工作的内容转换为 C# 的任务。
我知道 C# 不支持真正的多重继承,但它可以通过接口和组合来模拟。
在 C++ 中,我有一个设计,其中两个类从一个父类继承。假设 Vehicle 是父类,而 Car 和 Boat 继承自 Vehicle。
还有第二个类,从中派生出另外三个类。我们称之为许可证。三个附加类继承自三个 Vehicle 类和 License 类。
所以我们有类似的东西:
// C++
class Vehicle
{
public:
virtual void move();
};
class Car : public Vehicle
{
public:
void move();
};
class Boat : public Vehicle
{
public:
void move();
};
class License
{
public:
void renew();
};
class LicensedVehicle : public Vehicle, public License {...};
class LiscensedCar : public Car, public License {...};
class LisencedBoat : public Boat, public License {...};
现在在我的主要方法中,我可以为上面的三个多重继承类创建对象,并将它们添加到两个指针数组中,一个是 Vehicle 类型,一个是 License 类型。然后,我可以从一个阵列访问 Vehicle 的一半功能,从另一个阵列访问 License 功能。例如:
// C++
Vehicle* VehicleHeteroArray[3];
License* LiscenseHeteroArray[3];
LisencedVehicle* lvPtr = new LisencedVehicle();
LisencedCar* lcPtr = new LisencedCar();
LisencedBoat* lbPtr = new LisencedBoat();
VehicleHeteroArray[0] = lvPtr;
LiscenseHeteroArray[0] = lcPtr;
VehicleHeteroArray[1] = lcPtr;
LiscenseHeteroArray[1] = lcPtr;
VehicleHeteroArray[2] = lbPtr;
LiscenseHeteroArray[2] = lbPtr;
现在我可以遍历这两个数组并访问 Vehicle 和 License 中的每个方法。例如:
// C++
for (int i = 0; i < 3; i++)
{
VehicleHeteroArray[i].move();
LiscenseHeteroArray[i].renew();
}
现在这在 C++ 中运行良好,所以我的问题是将其翻译成 C#。有什么合理的方法可以做类似的事情吗?
到目前为止,我已经设置了三个车辆类,并通过执行以下操作设置了三个“模拟多重继承”类:
// C#
class Vehicle
{
public virtual void move();
}
class Car : Vehicle
{
public override void move();
}
class Boat : Vehicle
{
public override void move();
}
interface ILicense
{
void renew();
}
class License : ILicense
{
public void renew();
}
class LicensedVehicle : Vehicle, ILicense
{
License l;
void ILicense.renew()
{
l.renew();
}
}
class LiscensedCar : Car, ILicense {...}
class LisencedBoat : Boat, ILicense {...}
我知道我可以创建一个 Vehicle 类型的异构数组并访问 move(),但是有什么方法可以让一个异构集合也访问 renew(),就像我在 C++ 中使用 LiscenseHeteroArray[] 所做的那样?