Невозможно привести объект к интерфейсу, который он реализует - привести интерфейс к другому интерфейсу - PullRequest
0 голосов
/ 06 декабря 2018

краткое описание моей проблемы.Я передал универсальный объект (интерфейс) в качестве параметра для моего метода.Мне нужно вызвать некоторый метод, который будет общим для подмножества объектов, которые реализуют мой интерфейс.Я не хочу "иметь if () тогда" для каждого типа объекта там.давайте назовем интерфейс IVehicles.

public interface IVehicle 

{
    Object SomeValue { get;  }
}
public class Car : IVehicle{ //some code here}

Нет смысла добавлять метод в IVehicle, поскольку не разделяют всю логику.

Мне нужно вызывать SomePersonalValue только для подмножества IVehicle.Поэтому я реализовал другой интерфейс 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;

}

, проблема в том, что он вызывает Unable для приведения объекта Car к интерфейсу IPersonalVehicle.IЯ также пытался расширить свой интерфейс с помощью IVehicles, и resilt такой же.

public interface IPersonalVehiclee : IVehiclee
{
    long SomePersonalValue { get;  }
}

Что я делаю не так?

РЕДАКТИРОВАТЬ - РЕШЕНО Я забыл или как-топотерял в редактировании кода, чтобы расширить мой автомобиль и мотоцикл с помощью IPersonalVehicle LOL, так что это решение работает!Спасибо, в любом случае!

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Если вы правильно разместите свой вопрос, он прекрасно работает:

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";
}
0 голосов
/ 06 декабря 2018

Я думаю, что если вы используете оба интерфейса, вы можете просто ввести IPersonalVehicles (что расширяет IVehicles).Вам не разрешено приводить один интерфейс в другой, потому что это не имеет смысла.

Попробуйте подумать об этом: IPersonalVehicles имеет свои собственные свойства (и методы) и одинаков для IVehicles.Итак, как ты мог их разыграть?Помните, что кастинг основан на наследовании

Дайте мне знать, если я вам помогу!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...