Есть ли способ сделать так, чтобы каждый класс, реализующий интерфейс Ae, имел список одного из конкретных классов, реализующих Ba как свойство?

  • У меня есть интерфейс (Ae), в котором есть список объектов (List) из другого интерфейса (Ba).
  • У меня есть класс, реализующий интерфейс Ae.
  • У меня есть несколько классов, реализующих интерфейс Ba.

Есть ли способ сделать так, чтобы каждый класс, реализующий интерфейс Ae, имел список одного из конкретных классов, реализующих Ba как свойство?

public interface IQuestion
{
    IAnswerOption[] Answers { get; set; }
}

public interface IAnswerOption
{
    int Id { get; }
    bool IsCorrect { get; set; }
}

public class AnswerOptionText : IAnswerOption
{
    public int Id { get; }
    public bool isCorrect;
    public string ansText;
}

public class AnswerOptionImage : IAnswerOption
{
    public int Id { get; }
    public bool isCorrect;
    public string imgSlug;
}

public class AudioQuestion : IQuestion
{
    public AnswerOptionImage[] Answers;
    public string audioName;
}

public class TextQuestion : IQuestion
{
    public AnswerOptionText[] Answers { get; set; }
    public string questionText { get; set; }
}

Когда я пытаюсь это сделать, AudioQuestion и TextQuestion не позволяют мне использовать AnswerOptionImage[] и AnswerOptionText[]. соответственно.

Visual Studio говорит, что мне нужно реализовать элемент интерфейса IQuestion.Answers, но это не то, что я собираюсь сделать.

Если кто-то может мне помочь, я был бы очень признателен. Спасибо.


person Diogo Ferreira    schedule 12.08.2020    source источник


Ответы (1)


Похоже, что использование универсальных шаблонов для вашего IQuestion интерфейса быть в хорошей форме:

public interface IQuestion<T> where T: IAnswerOption
{
    T[] Answers { get; set; }
}

public class AudioQuestion : IQuestion<AnswerOptionImage>
{
    public AnswerOptionImage[] Answers{ get; set; }
    public string audioName;
}

public class TextQuestion : IQuestion<AnswerOptionText>
{
    public AnswerOptionText[] Answers { get; set; }
    public string questionText { get; set; }
}
person Guru Stron    schedule 12.08.2020
comment
Спасибо. Представьте, что в будущем я хочу, чтобы класс TextQuestion получал как AnswerOptionText[], так и AnswerOptionImage[]. Что было бы лучшим подходом для этого? Что ты посоветуешь? - person Diogo Ferreira; 13.08.2020
comment
@DiogoFerreira, поскольку в банкомате C # нет встроенных размеченных союзов, вы можете попробовать реализовать какой-то тип OneOf<T1, T2> (несколько из них с разным количеством параметров) или использовать текущий, разрешающий любой тип ответа. - person Guru Stron; 13.08.2020
comment
Я не понял, что вы подразумеваете под OneOf‹T1,T2› (где я могу увидеть больше об этом?). Как я могу использовать свой текущий, разрешая любой тип ответа? Этого достаточно открытого класса TextQuestion : IQuestion‹IAnswerOption›? Извините за вопросы, но я новичок и для меня все очень запутанно. - person Diogo Ferreira; 13.08.2020