首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >遗产继承。多态抽象化

遗产继承。多态抽象化
EN

Stack Overflow用户
提问于 2014-08-04 01:16:48
回答 2查看 380关注 0票数 0

我正在为学生开发一个测试平台应用程序。由于这个问题可以有一个或多个正确的答案,我需要单选按钮/复选框来选择正确的答案。我想用Add方法实现一个抽象类。从它派生两个类,每个类包含一个RaddioButtons或Checkboxes数组。是否有比下面列出的方法更好的方法来做到这一点?我的意思是,add方法可以放在抽象类中吗?

代码语言:javascript
复制
public class AnswerForm
    {
        public static int no;

        public AnswerForm()
        {
            no=0;
        }
    }

    public class RadioButtonClass:AnswerForm
    {
        RadioButton[] vector;

        public void Add(RadioButton rbutton)
        {
            vector[no++] = rbutton;
        }
    }

    public class CheckBoxClass : AnswerForm
    {
        CheckBox[] vector;

        public void Add(CheckBox cbox)
        {
            vector[no++] = cbox;
        }
    }

我还有两个向量,在其中我放置了一个固定数量的元素,RadioButtons和复选框。这些元素存在于Windows Form1.cs[design]中。我想要做的是将一个类型为AnswerForm的元素传递给一个函数,在函数中,根据我的问题类型,为一个派生类将内存分配给我的AnswerForm对象。此外,如果Add方法以s字符串和vector[no++].Text=s作为参数,则可能更容易;

该功能的原型:

代码语言:javascript
复制
public void readQuestions(RichTextBox richTextBox, AnswerForm answerForm)

在这里,我解析一个XML文件并将对象放在一个列表中。XML包含Questions,每个Questions都有一个类型(多个答案或单个答案)、传递到richTextBox的文本以及答案。接下来,我将遍历问题列表并检查问题的类型。如果有多个答案,那么将每个答案放入一个CheckBox.Text中。否则,把它放在一个RadioButton.Text中。在将文本分配给每个WinForm元素之前,我希望分配相应的对象类型(RadioButtonClass或CheckBoxClass),然后对当前问题的每个答案使用add方法。这就是为什么我想到继承,抽象一种多态。

这就是现在的样子:

代码语言:javascript
复制
public void readQuestions(RichTextBox richTextBox, AnswerForm answerForm)
        {
            var file = XDocument.Load("QuestionsTest.xml");
            var subject = new Subject();
            subject.Name = (string)file.Root.Attribute("Subject");

            var questions = from question in file.Root.Elements("Question")
                            select new Question
                            {
                                NumberOfCorrectAnswers=(int)question.Attribute("NumberOfAnswers"),
                                Text = (string)question.Element("Text"),
                                Answers = new List<Answer>(
                                    from answers in question.Element("Answers").Elements("Answer")
                                    select new Answer
                                    {
                                        Text = (string)answers
                                    })
                            };

            using (var db = new TestingPlatformContext())
            {
                db.Subjects.Add(subject);

                foreach (var question in questions)
                {
                    //Console.WriteLine("Subject: {0}\n Text: {1}", question.Subject, question.Text);
                    richTextBox.Text = question.Text;
                    //db.Questions.Add(question);
                    foreach (var answer in question.Answers)
                        //Console.WriteLine("Answer: {0}", answer.Text);
                        if (question.NumberOfCorrectAnswers != 1)
                        {
                            answerForm = new CheckBoxClass();
                            answerForm.Add(answer.Text);
                            //db.Answers.Add(answer);
                        }
                        else
                        {
                            answerForm = new RadioButtonClass();
                            answerForm.Add(answer.Text);
                        }
                }
            }
        }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-04 01:25:22

是的,可以使用泛型将Add()方法移动到父类:

代码语言:javascript
复制
public class AnswerForm<T>
{
    private readonly IList<T> _list;

    public AnswerForm()
    {
        _list = new List<T>();
    }

    public void Add(T button)
    {
        _list.Add(button);
    }
}

public class RadioButtonClass:AnswerForm<RadioButton>
{
}

public class CheckBoxClass : AnswerForm<CheckBox>
{
}

我做了一些修改:-使用列表而不是数组,在本例中它更灵活-在父类AnswerForm中使用泛型

票数 2
EN

Stack Overflow用户

发布于 2014-08-04 10:53:53

一个很简单的解决方案应该是这样的:

代码语言:javascript
复制
public class AnswerForm
        {
            public static int no;
            private RadioButton[] rbuttons;
            private Checkbox[] checkboxes;

            public AnswerForm()
            {
                no=0;
                rbuttons = new RadioButton[] 
                {
                    radioButton1,radioButton2,radioButton3,radioButton4,radioButton5
                };
                checkboxes = new CheckBox[]
                {
                    checkBox1,checkBox2,checkBox3,checkBox4,checkBox5,checkBox6
                };
            }
            public void AddRadio(string s)
            {
                rbuttons[no++].Text=s;
            }
            public void AddBox(string s)
            {
                checkboxes[no++].Text=s;
            }
        }

但这还远远不够优雅。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25110598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档