В Generate_Questions
вы создаете новый экземпляр Visual_Question
, а затем немедленно вызываете draw_question
для этого нового экземпляра. Теперь у вас есть 2 экземпляров вопроса (оба получены из Generate_Questions
), но только у одного из них был метод Start
, который инициализирует q4
. Однако если вы попытаетесь вызвать Start
из своего второго экземпляра, вы попадете в бесконечную серию рекурсивных вызовов и быстро завершите работу с другой ошибкой (переполнение стека в этом случае).
Одна проблема с текущим кодом состоит в том, что Generate_Questions
звучит больше как действие, чем класс. Я бы предложил убрать наследование из Visual_Question
и сделать его интерфейсом, который вы бы реализовали на Question
. Question
, вероятно, следует удалить метод create_question
. Это, вероятно, относится к сценарию MonoBehavior
(технически это фабричный метод - посмотрите фабричный шаблон - я не буду вдаваться в подробности, так как это тема для начинающих).
Что-то вроде (очевидно, не завершено):
public class Generate_Questions : MonoBehaviour
{
private IVisualQuestion q4;
void Start()
{
q4 = new Question("Select object to edit", EXTERNAL);
q4.DrawQuestion(new vector(1,1,1), Ui, Canvas)
}
void Update() {}
}
public interface IVisualQuestion
{
void DrawQuestion(Vector2 loc, Dictionary<string, RectTransform> ui, RectTransform canvas);
}
public class Question : IVisualQuestion
{
// ... insert the Question constructor and code here ...
// Implement VisualQuestion interface
public void DrawQuestion(Vector2 loc, Dictionary<string, RectTransform> ui, RectTransform canvas)
{
this.SetAnswers(new Answer[]{new Answer(null, "Select an option")});
}
}
В общем, вам, вероятно, не нужно наследование. Когда вы узнаете больше о C #, вы обнаружите, что когда наследование поможет, это станет ясно. Чаще всего использование интерфейса - гораздо лучший и гибкий подход. Как заметил комментатор, вы, вероятно, не хотите наследовать от MonoBehavior
. Это действительно нужно только для классов, которые Unity Engine будет обрабатывать напрямую.
Еще одно примечание: в C # принято называть методы, переменные и т. Д. В PascalCase, не используя подчеркивания для разделения слов.