首页 > 解决方案 > 有没有办法为子类属性设置一个值并且它出现在不同的基类属性中?

问题描述

有没有办法将值 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)
    {
           
    }
}

如您所见,AnswerOptions 已填充:

但是 CurrentQuestion.Answers 为空

如果有人可以帮助我,我将不胜感激。谢谢。

标签: c#oopunity3dproperties

解决方案


这里的问题是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

推荐阅读