有什么方法可以将值设置为子类属性,并且该值出现在其他基类属性中?

问题描述

是否可以将值X设置为子类属性(TextAnswers []),并且该值出现在基类属性(Answers [])上? 我对另外两个类也有类似的问题,但是由于我想要的属性在基类和子类中具有相同的类型,因此很容易。我只是将该属性放在基类上。

在这种情况下,属性具有不同的类型(IAnswerOption和AnswerOptionImage)。

在我看来,完美的解决方案是在子类上设置一个属性,然后尝试将该值传递给基类,但是我为此感到困惑。我留下了下面的代码,如果您不明白我的意图,我可以更好地解释它。

这是我的基础课:

[System.Serializable]
public class Question : IQuestion<IAnswerOption>
{
    public virtual IAnswerOption[] Answers { get; set; }
}

这是我的子类:

[System.Serializable]
public class AudioQuestion : Question
{
    [field: Serializefield] private AnswerOptionImage[] answerOptions;

    public IAnswerOption[] AnswerOptions
    {
        get { return (IAnswerOption[]) answerOptions;}
        set { answerOptions = (AnswerOptionImage[]) Answers;  }
    }

    public string audioName;
}

问题出现在这里我有一堂课收到一个问题。我创建了Question类型的属性,以便能够接收Question的任何子类。我进行了调试,当到达foreach时出现了问题。

protected Question CurrentQuestion { get; set; }

public void Method() 
{
    foreach (var answer in CurrentQuestion.Answers)
    {
           
    }
}

您会看到AnswerOptions已填充:

但是CurrentQuestion.Answers为空

如果有人可以帮助我,我将非常感激。谢谢。

解决方法

这里的问题是Question.Answers有一个公共设置器;这使得无法安全地在子类中使用更具体的类型。

例如:

public class SomeOtherAnswerOption : IAnswerOption { }

Question audioQuestion = new AudioQuestion();
audioQuestion.Answers = new SomeOtherAnswerOption[] { }; // You probably don't want to allow this

如果从基类中删除公共设置器,则可以执行以下操作:

[System.Serializable]
public class Question : IQuestion<IAnswerOption>
{
    public virtual IAnswerOption[] Answers { get; protected set; } // Setter protected
}

[System.Serializable]
public class AudioQuestion : Question
{
    // Hide the base property but use it in the implementation
    public new AnswerOptionImage[] Answers
    {
        get => base.Answers as AnswerOptionImage[];
        set { base.Answers = value; }
    }
}

new关键字隐藏了基类属性,但是无论对象是被视为Question还是AudioQuestion,都可以检索该数组:

AudioQuestion audioQuestion = new AudioQuestion();
audioQuestion.Answers = new AnswerOptionImage[] { };

Question question = audioQuestion;
audioQuestion.Answers == question.Answers; // true;

question.Answers = new SomeOtherAnswerOption[] { }; // Compilation error
,

我通过以下方法解决了这个问题:

    AudioQuestion audioQuestion = (AudioQuestion)unansweredQuestions[randomQuestionIndex];
    CurrentQuestion = audioQuestion;
    CurrentQuestion.Answers = audioQuestion.AnswerOptions;

首先,我将问题存储在audioQuestion中,然后将音频问题分配给CurrentQuestion,最后,我将AnswerOptions []复制到Answers []。

这样,当我检查CurrentQuestion Answers []属性具有与AnswerOptions []相同的值时。