我的问题的简短描述。我已经将通用对象(接口)作为参数传递给了我的方法。我需要调用一些对实现我的接口的对象子集来说通用的方法。我不想为每种类型的对象“拥有if()然后”。我们将其称为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大声笑来扩展我的汽车和摩托车,所以该解决方案有效!不管怎么说,还是要谢谢你!
答案 0 :(得分:1)
如果您正确地发布了问题,则可以正常运行:
class Program
{
static void Main()
{
Call(new Car());
Call(new MotorBike());
}
public static void Call(IVehicles vehicle)
{
Object someIrrelevantObject = vehicle.SomeValue;
//here my change begins
IPersonalVehicles personalVehicle = (IPersonalVehicles)vehicle;
long somePersonalValue = personalVehicle.SomePersonalValue;
}
}
public interface IVehicles
{
Object SomeValue { get; }
}
public interface IPersonalVehicles
{
long SomePersonalValue { get; }
}
public class Car : IVehicles, IPersonalVehicles
{
public long SomePersonalValue => long.MinValue;
public object SomeValue => "car value";
}
public class MotorBike : IVehicles, IPersonalVehicles
{
public long SomePersonalValue => long.MaxValue;
public object SomeValue => "motorbike value";
}
答案 1 :(得分:0)
我认为,如果您同时使用两个接口,则只需注入IPersonalVehicles
(扩展了IVehicles
)。不允许您将一个接口强制转换为其他接口,因为这没有任何意义。
尝试考虑一下:IPersonalVehicles
有自己的属性(和方法),与IVehicles
相同。那么,你怎么投他们呢?请记住,投射是基于继承的
让我知道我是否可以帮助您!