C# - 不同类对象的数组

时间:2017-08-30 21:06:18

标签: c# arrays class testing

我坐在这里有点问题。 我必须创建一个程序来解决测试。 需要有一个基本类,4个继承它,全部用于其他类型的任务(一些有1个答案,有些有数字答案等)。 还需要一个任务集合,一个不同类对象的数组。数组包含不同的任务,然后我必须从中绘制10个任务。有没有更简单的方法来完成我正在进行的任务收集?

     public class Program
{

    public class Task
    {
        protected string contents;
        protected int nr_pyt;
    };

    public class Task4Answ : Task
    {
        private
            char odp;
        public
        Task4Answ(string contents1, int nr, string odp1)
        {
            contents = contents1;
            nr_pyt = nr;
            odp = odp1[0];
        }
    };

    public class TaskNumber : Task
    {
        private
            int odp;
        public
        TaskNumber(string contents1, int nr, int odp1)
        {
            contents = contents1;
            nr_pyt = nr;
            odp = odp1;
        }
    };

    public class TaskString : Task
    {
        private
            string odp;
        public
        TaskString(string contents1, int nr, string odp1)
        {
            contents = contents1;
            nr_pyt = nr;
            odp = odp1;
        }
    };

    public class TaskFewAnsw : Task
    {
        private
            string odp;
            string odpp;
            string odppp;
        public
        TaskFewAnsw(string contents1, int nr, string odp1,string odpp1, string odppp1)
        {
            contents = contents1;
            nr_pyt = nr;
            odp = odp1;
            odpp = odpp1;
            odppp = odppp1;
        }
    };

    public class TaskCollection
    {
        public Task[] collection;
        public TaskCollection()
        {
            collection = new Task[60];
            collection[0] = new Task4Answ("Ile jest por roku w Polsce? \na) 1 \nb) 2 \nc) 3 \nd) 4", 1, "d");
            collection[1] = new Task4Answ("Kto wygral tegoroczny Roland Garros? \na) Federer \nb) Djokovic \nc) Nadal \nd) Thiem", 1, "c");
            collection[2] = new Task4Answ("Kto jest premierem Polski? \na) Macierewicz \nb) Duda \nc) Kaczynski \nd) Szydlo", 1, "d");
            collection[3] = new Task4Answ("Ktore slowo kluczowe w C++ jest uzywane do deklarowania typu zmiennoprzecinkowego \na) Float \nb) Int \nc) Enum \nd) Struct", 1, "float");
            collection[4] = new Task4Answ("Ktory z podanych modyfikatorow dostepu pozwala na uzywanie zmiennych klasy bazowej w klasach pochodnych, a w innych klasach nie? \na) Domyslny \nb) Public \nc) Private \nd) Protected", 1, "d");
            collection[5] = new Task4Answ("Jakiego slowa kluczowego uzywamy do zwrocenia obiektu z funkcji? \na) Back \nb) Reversion \nc) Return \nd) Void", 1, "c");
            collection[6] = new Task4Answ("Ktory z samochodow nalezy do fabryki Volkswagenta? \na) Mondeo \nb) Passat \nc) Vectra \nd) Yaris", 1, "b");
            collection[7] = new Task4Answ("Ktory czlowiek na swiecie pierwszy stanal na ksiezycu? \na) Gagarin \nb) Lajka \nc) Armstrong \nd) Ahonen", 1, "c");
            collection[8] = new Task4Answ("Ktory z samochodow nalezy do fabryki Opla? \na) Mondeo \nb) Passat \nc) Vectra \nd) Yaris", 1, "c");
            collection[9] = new Task4Answ("Z iloma panstwami graniczy Polska? \na) 5 \nb) 6 \nc) 7 \nd) 8", 1, "c");
            collection[10] = new Task4Answ("Od ktorego roku Polska nalezy do Unii Europejskiej? \na) 2004 \nb) 2006 \nc) 2002 \nd) 2000", 1, "a");
            collection[11] = new Task4Answ("Kto jest obecnym prezesem PZPN? \na) Boniek \nb) Lato \nc) Listkiewicz \nd) Gmoch", 1, "a");
            collection[12] = new Task4Answ("Ktora z planet posiada charakterystyczny pierscien? \na) Neptun \nb) Jowisz \nc) Saturn \nd) Merkury", 1, "c");
            collection[13] = new Task4Answ("Za pomoca jakiego slowa kluczowego definiujemy szablony w C++? \na) Template \nb) Pattern \nc) Stencil \nd) Stereotype", 1, "a");
            collection[14] = new Task4Answ("Ktory z podanych jezykow posiada interfejsy? \na) C++ \nb) C \nc) C# \nd) HTML", 1, "c");
            collection[15] = new TaskNumber("Podaj date Bitwy Pod Grunwaldem", 15, 1410);
            collection[16] = new TaskNumber("Podaj maksymalna predkosc w terenie zabudowanym", 16, 50);
            collection[17] = new TaskNumber("W ktorym roku odbyly sie Mistrzostwa Europy w Pilce w Polsce?", 17, 2012);
            collection[18] = new TaskNumber("Ile bajtow pamieci zajmuje typ long w jezyku C++?", 18, 8);
            collection[19] = new TaskNumber("W ktorym roku w Polsce ogloszono stan wojenny?", 19, 1978);
            collection[20] = new TaskNumber("Po dodaniu dwoch zmiennych typu int, ile bajtow pamieci zajmie zmienna przechowujaca wynik tego dodawania?", 20, 4);
            collection[21] = new TaskNumber("Ile wynosi reszta z dzielenia liczby 60 przez liczbe 7?", 21, 4);
            collection[22] = new TaskNumber("Ile wynosi pierwiastek z liczby 49?", 22, 7);
            collection[23] = new TaskNumber("W ktorym roku rozpoczela sie II Wojna Swiatowa?", 23, 1939);
            collection[24] = new TaskNumber("W ktorym roku mial miejsce chrzest Polski?", 24, 966);
            collection[25] = new TaskNumber("Ile zlotych medali zdobyl Adam Malysz na Igrzyskach Olimpijskich?", 25, 0);
            collection[26] = new TaskNumber("Ile lat trwa kadencja prezydenta w Polscce", 26, 4);
            collection[27] = new TaskNumber("Jezeli na kazde 15 metrow kwadratowych przypada 6 wezy, ile wezy przypadnie na 90 metrow kwadratowych", 27, 36);
            collection[28] = new TaskNumber("W ktorym roku mial miejsce atak terrorystyczny na World Trade Center", 28, 2002);
            collection[29] = new TaskNumber("Jezeli 3 lata temu Ania ktora ma teraz 18lat byla 3 razy starsza od Tomka, to ile lat ma teraz Tomek", 29, 8);
            collection[30] = new TaskString("Podaj wzor chemiczny wody", 30, "H2O");
            collection[31] = new TaskString("Podaj gdzie urodzil sie Kopernik", 31, "Torun");
            collection[32] = new TaskString("Na jakim instrumencie gral Fryderyk Chopin", 32, "Fortepian");
            collection[33] = new TaskString("Podaj slowo kluczowe, ktorego uzywa sie do zwalniania pamieci w C++", 33, "Delete");
            collection[34] = new TaskString("Jak nazywa sie program w C# pelniacy role destruktora?", 34, "Garbage Collector");
            collection[35] = new TaskString("Jakiego slowa kluczowego uzywamy w C# do przyslaniania funkcji klasy bazowej?", 35, "Override");
            collection[36] = new TaskString("Jakie miasto jest stolica Kanady?", 36, "Ottawa");
            collection[37] = new TaskString("Jaka jest najwieksza wyspa na swiecie?", 37, "Grenlandia");
            collection[38] = new TaskString("Skad pochodzi sprinter Usain Bolt?", 38, "Jamajka");
            collection[39] = new TaskString("Jakiego slowa kluczowego uzywamy do deklarowania klas abstrakcyjnych w C#", 30, "Abstact");
            collection[40] = new TaskString("Jakiego slowa kluczowego uzywamy do deklarowania klas wirtualnych w C#", 40, "Virtual");
            collection[41] = new TaskString("Podaj slowo kluczowe, ktorego uzywa sie do deklarowania struktur w C# i C++", 41, "Struct");
            collection[42] = new TaskString("Jak nazywa sie dziedzina nauki, zajmujaca sie m.in kosmosem?", 42, "Astronomia");
        }

static void Main(string[] args)
        {
            TaskCollection T1= new TaskCollection();
            Task[] tab;
            tab = new Task[10];
            for(int i=0; i<10; i++)
            {
                tab[i] = T1.collection[i];
            }
            Console.WriteLine(tab[0]);
            System.Console.ReadKey();


        }
       };

然后在这里我必须从这个集合中绘制10个任务,但我不能从集合中复制它,因为所有这些都来自不同的类。

1 个答案:

答案 0 :(得分:0)

回答您的第一个直接问题:

  

问题是我不知道如果它是TaskString,Task4Answ或其他类型我如何识别。

这可以通过使用GetType()方法来实现。我们假设您获得了collection中的第一个元素,并且您希望确定它是type

var item = collection[i];
if (item.GetType().Name == "TaskString")
    // You have a TaskString object.
else if (item.GetType().Name == "Task4Answ")
    // You have a Task4Answ object

这很容易。

然而,您的代码存在很多问题。这听起来非常功课,所以我没有使用你的课程结构,而是使用我自己的类似于你的课程,并说明了同样的问题。希望您能理解我的解释并能够将其转换并适用于您的问题。

假设您有一个Employee基类,以及两个继承它的子类,即EmpTypeOneEmpTypeTwo。基类的属性为IDEmpTypeOneNameEmpTypeTwoNameCity

public class Employee
{
    public int ID { get; set; }
}

public class EmpTypeOne : Employee
{
    public string Name { get; set; }

    public EmpTypeOne(int id, string name)
    {
        ID = id;
        Name = name;
    }
}

public class EmpTypeTwo : Employee
{
    public string Name { get; set; }
    public string City { get; set; }

    public EmpTypeTwo(int id, string name, string city)
    {
        ID = id;
        Name = name;
        City = city;
    }
}

您正在做的是创建一份“员工”列表。类对象,并将不同的子类实例放入其中。所以后来,我假设,你想获得那些不同类型的对象并使用它们的成员变量等。但那是你的第一个问题。

当您创建基类对象的列表并在其中放置子类对象时,您将只能访问那些中的基类属性/成员,即使它们被创建为子类。

也就是说,你无法做到这一点:

List<Employee> employees = new List<Employee>();
employees.Add(new EmpTypeOne(1, "Tim"));
employees[0].Name; // This won't be allowed because `employees[0]` is parent class and has no knowledge of the child-class property `Name`.

你应该做的是,正如NetMage在评论中建议的那样,将你的方法放在你的基类中,然后在你的子类中覆盖它们以使用它们的变量并完成工作。例如,假设您要显示员工信息,但基于不同的子类,您希望以不同的格式显示不同的信息。你可以这样做。

public class Employee
{
    public int ID { get; set; }

    public virtual void DisplayInfo()
    {

    }
}

public class EmpTypeOne : Employee
{
    public string Name { get; set; }

    public EmpTypeOne(int id, string name)
    {
        ID = id;
        Name = name;
    }

    public override void DisplayInfo()
    {
        Console.WriteLine("I'm a Type A Employee");
        Console.WriteLine("ID : {0}, Name : {1}", ID, Name);
    }
}

public class EmpTypeTwo : Employee
{
    public string Name { get; set; }
    public string City { get; set; }

    public EmpTypeTwo(int id, string name, string city)
    {
        ID = id;
        Name = name;
        City = city;
    }

    public override void DisplayInfo()
    {
        Console.WriteLine("I'm a Type B Employee");
        Console.WriteLine("ID : {0}, Name : {1}, City : {2}", ID, Name, City);
    }
}

public static void Main()
{
    List<Employee> emps = new List<Employee>();
    emps.Add(new EmpTypeOne(1, "Tim"));
    emps.Add(new EmpTypeTwo(2, "Jane", "Chicago"));

    emps[0].DisplayInfo();
    Console.WriteLine();
    emps[1].DisplayInfo();

    Console.ReadLine();
}

最后,您的TaskCollection课程实施也不是很好。您已经完成的方式,您需要对每个孩子的信息进行硬编码。你需要做的是有一个基类列表,然后再添加项目。类似于:

public class EmployeeCollection
{
    public List<Employee> Employees;

    public EmployeeCollection()
    {
        Employees = new List<Employee>();
    }

    public void AddTypeOne(int id, string name)
    {
        if (Employees == null)
            Employees = new List<Employee>();
        Employees.Add(new EmpTypeOne(id, name));
    }

    public void AddTypeTwo(int id, string name, string city)
    {
        if (Employees == null)
            Employees = new List<Employee>();
        Employees.Add(new EmpTypeTwo(id, name, city));
    }
}

然后将对象添加到列表中,如下所示:

EmployeeCollection employees = new EmployeeCollection();
employees.AddTypeOne(1, "Tim");
employees.AddTypeTwo(2, "Jane", "Chicago");