【发布时间】:2019-05-08 03:44:38
【问题描述】:
我的问题的简短描述。我已将通用对象(接口)作为参数传递给我的方法。我需要调用一些对实现我的接口的对象子集很常见的方法。我不想为那里的每种类型的对象“拥有 if() then”。我们将接口称为 IVehicles。
public interface IVehicle
{
Object SomeValue { get; }
}
public class Car : IVehicle{ //some code here}
由于不共享所有逻辑,向 IVehicle 添加方法没有意义。
我只需要在 IVehicle 的子集上调用 SomePersonalValue。所以我实现了另一个接口 IPersonalVehicle 并扩展了我的对象:
public interface IPersonalVehicle
{
long SomePersonalValue { get; }
}
public class Car : IVehicle, IPersonalVehicle {}
public class MotorBike : IVehicle, IPersonalVehicle {}
现在我有了我的方法
public void Call(IVehicle vehicle)
{
Object someIrrelevantObject = vehicle.SomeValue;
//here my change begins
IPersonalVehicle personalVehicle = (IPersonalVehicle)vehicle;
long somePersonalValue = personalVehicle.SomePersonalValue;
}
问题在于它引发了无法将对象 Car 转换为接口 IPersonalVehicle。我也尝试通过 IVehicles 扩展我的接口,结果是一样的。
public interface IPersonalVehiclee : IVehiclee
{
long SomePersonalValue { get; }
}
我做错了什么?
编辑 - 已解决 我忘记或不知何故丢失了代码编辑以通过 IPersonalVehicle 扩展我的汽车和摩托车大声笑,所以这个解决方案有效!不管怎么说,还是要谢谢你!
【问题讨论】:
-
因为
IVehicle和IPersonalVehicle之间没有任何关系。您可以将IPersonalVehicle声明为interface IPersonalVehicle : IVehicle,它将允许您投下 -
你能发布一个可以编译的代码吗?目前您有一个拼写错误,例如
IVehicles和IVehicle。 -
@Sanan Fataliyev 但在您的建议中,我认为我需要使用 SomePersonalValue 方法扩展所有实现 IVehicle 的类,还是我错了?
-
@Dennis 拼写错误已修复。
-
@SananFataliyev:可以猜,实现
IFoo的对象也可以实现IBar。从编译器和设计角度来看,此代码都是合法的。这并不意味着IFoo和IBar必须以某种方式相关。
标签: c# inheritance interface casting architecture