Я пытаюсь создать класс, но не могу получить доступ к неинтерфейсным методам. - PullRequest
0 голосов
/ 08 февраля 2019

Скажите, если у меня есть интерфейс

public interface IVehicle<T>
{
    string Drive();
    string Stop();
}

И два класса Car () и Airplane ()

Каждый имеет класс, который использует интерфейс для выполнения действий

public class CarActions : IVehicle<Car>
{
    public string Drive()
    {
        return "Go";
    }

    public string Stop()
    {
        return "Stop";
    }
}

и

public class AeroplaneActions : IVehicle<Aeroplane>
{
    public string Drive()
    {
        return "Go";
    }

    public string Stop()
    {
        return "Stop";
    }

    public virtual string Fly()
    {
        return "Fly";
    }     
}

Когда я высмеиваю класс «Самолет», он не найдет метод fly (), потому что он не является частью интерфейса

  Mock<AeroplaneActions> mockedDirectly = new Mock<AeroplaneActions>();

        mockedDirectly.Setup(method => method.Drive()).Returns("Drive");
        mockedDirectly.Setup(method => method.Stop()).Returns("Stop");
        mockedDirectly.Setup(method => method.Fly()).Returns("Fly");

Я попытался издеваться надНепосредственно класс действий, который работает, однако мне нужно будет изменить мои методы на виртуальные в этом случае, которых я хотел бы избежать.

        Mock<AeroplaneActions> mockedDirectly = new Mock<AeroplaneActions>();

        mockedDirectly.Setup(method => method.Drive()).Returns("Drive");
        mockedDirectly.Setup(method => method.Stop()).Returns("Stop");
        mockedDirectly.Setup(method => method.Fly()).Returns("Fly");

Мне интересно, есть ли другие альтернативы этому, кроме использованиявиртуальные методы?

1 Ответ

0 голосов
/ 11 февраля 2019

Возможно, вы могли бы создать другой интерфейс для AeroplaneActions, который будет наследоваться от IVehicle<T> и будет иметь метод Fly, например, так:

public interface IAeroplane<T> : IVehicle<T> 
{ 
    string Fly(); 
}. 

Тогда класс AeroplaneActions будетреализовать этот интерфейс:

AeroplaneActions : IAeroplane<Aeroplane>

И тогда должна быть возможность смоделировать этот интерфейс:

var mock = new Mock<IAeroplane<Aeroplane>>(). 
...