c# - 有没有办法为子类属性设置一个值并且它出现在不同的基类属性中?
问题描述
有没有办法将值 X 设置为子类属性 (TextAnswers[]) 并出现在基类属性 (Answers[]) 上?我对另外两个类也有类似的问题,但是由于我想要的属性在基类和子类中都是相同的类型,所以很容易。我只是让属性放在基类上。
在这种情况下,属性是不同的类型(IAswerOption 和 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
类属性,但无论对象被视为 aQuestion
还是AudioQuestion
,都可以检索到数组:
AudioQuestion audioQuestion = new AudioQuestion();
audioQuestion.Answers = new AnswerOptionImage[] { };
Question question = audioQuestion;
audioQuestion.Answers == question.Answers; // true;
question.Answers = new SomeOtherAnswerOption[] { }; // Compilation error
推荐阅读
- angular - 如何修复错误:在 Angular 中发出发布请求时出现“CORS 政策”
- groovy - runner.results do not provide results in sequence of test run
- javascript - How can I dynamically calculate row height by row index for VariableSizeList?
- javascript - NativeScript ListView Error when updating / changing the array it depends on
- javascript - 使用代理访问自定义元素的数据集
- model-view-controller - 如何最好地实现对传递给我的控制器的数据的 JWT 凭据的简单验证
- flutter - Unable to save sharepreference in flutter
- java - 如何在 apache-poi 中正确使用样式格式?
- yocto - 使用 bitbake 构建 OpenDDS
- javascript - 单击img时如何修复当前行的删除?