问题描述
是否可以将值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)
{
}
}
如果有人可以帮助我,我将非常感激。谢谢。
解决方法
这里的问题是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 []相同的值时。