Реализация интерфейса со свойством интерфейса - PullRequest
1 голос
/ 07 ноября 2019

У меня есть класс, у которого есть одно свойство, являющееся другим интерфейсом, как в примере ниже:

public interface ICar
{
    int ID { get; set; }
    ICarInfo Info { get; set; }
}

public interface ICarInfo
{
    Motor Motor { get; set; }
    Wheels Wheels { get; set; }
    String Category{ get; set; }
}

И две реализации для ICarInfo:

public Class SUVInfo : ICarInfo
{
    Motor Motor { get; set; } = new Motor("SUV");
    Wheels Wheels { get; set; } = new Wheels("SUV");
    String Category{ get; set; } = "SUV";
}

public Class CompactInfo : ICarInfo
{
    Motor Motor { get; set; } = new Motor("Compact");
    Wheels Wheels { get; set; } = new Wheels("Compact");
    String Category{ get; set; } = "Compact";
}

Я могу 't реализовать один класс ICar, используя реализацию ICarInfo, как в примере:

 public Class SUV : ICar
{
    int ID { get; set; }
    SUVInfo Info { get; set; }
}

SUVInfo - это ICarInfo, но появляется следующая ошибка:

'SUV' делаетне реализовывать интерфейсный элемент 'ICar.Info'. 'SUV.Info' не может реализовать 'ICar.Info', потому что у него нет соответствующего возвращаемого типа 'ICarInfo'.

Ответы [ 2 ]

4 голосов
/ 07 ноября 2019

Вместо разных классов для ICarInfo, которые отличаются только значениями своих свойств, вы можете просто использовать один класс и передать эти значения его конструктору:

public class CarInfo : ICarInfo {
    Motor Motor { get; set; }
    Wheels Wheels { get; set; }
    String Category{ get; set; }

    public CarInfo(Motor motor, Wheels wheels, string category)
    {
        this.Motor = motor;
        this.Wheels = wheels;
        this.Category = category;
    }
}

◆ вообще не нужно путаться с разными типами:

public Class SUV : ICar
{
    int ID { get; set; }
    ICarInfo Info { get; set; } = new CarInfo(new Motor("SUV"), new Wheels("SUV"), "SUV");
}

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

public interface ICar<T> where T: ICarInfo
{
    int ID { get; set; }
    T Info { get; set; }
}

public interface ICarInfo
{
    Motor Motor { get; set; }
    Wheels Wheels { get; set; }
    String Category{ get; set; }
}
public Class SUVInfo : ICarInfo
{
    Motor Motor { get; set; } = new Motor("SUV");
    Wheels Wheels { get; set; } = new Wheels("SUV");
    String Category{ get; set; } = "SUV";
}

public Class SUV : ICar<SUVInfo>
{
    int ID { get; set; }
    SUVInfo Info { get; set; }
}
0 голосов
/ 07 ноября 2019

Поскольку ваш SUV класса реализует интерфейс ICar, он должен реализовывать все свойства и функции, которые объявлены в этом интерфейсе. Так как ваш ICar выглядит следующим образом:

interface ICar
{
   int ID { get; set; }
   ICarInfo Info { get; set; }
}

ваш внедорожник должен выглядеть так (как минимум):

class SUV : ICar
{
    public int ID { get; set; }
    public ICarInfo Info { get; set; }
}

конечно, вы можете добавить любое другое свойство или функцию к вашемуКласс SUV.

Я думаю, что вы ожидали, что-то вроде наследования: поскольку SUVInfo уже реализует интерфейс ICarInfo, вы можете просто объявить свойство типа SUVInfo. Но реализация интерфейса в C # не работает так.

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