Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有任何方法可以将值设置为子类属性,并将其显示在不同的基类属性中?_C#_Oop_Unity3d_Properties - Fatal编程技术网

C# 是否有任何方法可以将值设置为子类属性,并将其显示在不同的基类属性中?

C# 是否有任何方法可以将值设置为子类属性,并将其显示在不同的基类属性中?,c#,oop,unity3d,properties,C#,Oop,Unity3d,Properties,有没有办法将值X设置为子类属性(TextAnswers[])并显示在基类属性(Answers[])上? 我在另外两个类中遇到了类似的问题,但由于我想要的属性在基类和子类中都是相同类型的,所以很容易。我只是把属性放在基类上 在这种情况下,属性的类型不同(IAnswerOption和AnswerOptionImage) 在我看来,完美的解决方案是在子类上设置一个属性,并尝试将值传递给基类,但我正在为此而挣扎。我留下了下面的代码,如果您不理解我的意图,我可以更好地解释它 这是我的基类: [System

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

如您所见,答案选项已填写:

但是当前问题。答案为空


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

这里的问题是
问题。答案
有一个公共设置器;这使得不可能在子类中安全地使用更具体的类型

例如:

public class SomeOtherAnswerOption : IAnswerOption { }

Question audioQuestion = new AudioQuestion();
audioQuestion.Answers = new SomeOtherAnswerOption[] { }; // You probably don't want to allow this
如果从基类中删除公共setter,可以执行以下操作:

[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; }
    }
}

我通过这样做解决了问题:

    AudioQuestion audioQuestion = (AudioQuestion)unansweredQuestions[randomQuestionIndex];
    CurrentQuestion = audioQuestion;
    CurrentQuestion.Answers = audioQuestion.AnswerOptions;
首先,我将我的问题存储在audioQuestion中,然后我将audioQuestion分配给CurrentQuestion,最后,我将AnswerOptions[]复制到Answers[]


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

问题不清楚,您想做什么?你有一个类,它接收一个“泛型类”的参数,允许传递它的子类,然后我没有听你的,我有一个问题类作为基类。除此之外,我还有几个问题的子类,比如AudioQuestion。两个班都有答案。然而,问题可以是各种类型的,答案也可以是各种类型的。正如您在上面看到的,我的问题在最后两张图片中得到了体现。作为AudioQuestion一部分的答案选项已填充,但来自基类的答案为空。我想要的是CurrentQuestion.Answers与AnswerOptions具有相同的值。此解决方案违反了开闭原则。每次创建
Question
的新子类时,您还需要记住更新此代码。如果你在其他地方做类似的事情,你会有严重的维护问题。
    AudioQuestion audioQuestion = (AudioQuestion)unansweredQuestions[randomQuestionIndex];
    CurrentQuestion = audioQuestion;
    CurrentQuestion.Answers = audioQuestion.AnswerOptions;