Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
1 / 1 / 2
Регистрация: 21.12.2010
Сообщений: 34
1

Полиморфизм

17.04.2011, 19:41. Показов 2950. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Есть задание - показать принцип полиморфизма в программе. Я написал некоторый код, однако компилятор ругается, что производные классы не реализовывают абстрактных методов базового класса.
Вот код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace polymorf
{
    abstract class Person
    {
        public int[] bilet;
        public string status;
        public int IQ, tails, age;
        public bool check;
        protected string name;
        public abstract void PrepareToExam();
        public abstract void Exam(Person b);
    }
    class Student : Person
    {
 
        public Student()
        {
            name = "Noname";
            age = 0;
            status = "studying"; 
            IQ = 0; 
            tails = 0; 
            check = true; 
        }
       public Student(string name, int age, string status, int IQ)  { 
           this.status = status; this.IQ=IQ;
           check = true; tails = 0;
           this.name = name;
           this.age = age;
       }
       public override void PrepareToExam()
       {
          IQ = IQ + 10;
       }
       public override void Exam(Teacher b)//и здесь ошибка
       {
 
           Random rand = new Random();
           int i = rand.Next(0, 24);
           if (IQ < b.bilet[i])
           {
               check = false;
           }
           else
           { check = true; }
 
       }
       public override string ToString()
       {
           return "Student " + name + " ," + age.ToString() + " years is " + status ;
       }
    }
    class Teacher : Person
    {
        public Teacher()  
        {
            name = "Noname";
            age = 0;
            int[] bilet = new int[25];
        }
        public Teacher(string name, int age)
        {
            this.name = name;
            this.age = age;
            int[] bilet = new int[25];
        }
        public override void Exam(Student b)//здесь ошибка
        {
            if (b.check == false)
            {
                b.tails++;
            }
        }
        public override void PrepareToExam()
        {
           Random rand = new Random();
           for (int i = 0; i < 25; i++)
           {
               bilet[i] = rand.Next(20, 115);
           }
        }
    }

Мне кажется, проблема в неправильной сигнатуре параметров метода Exam еще в абстрактном классе, но как это исправить, я пока не разобрался.
Буду Вам очень признателен, если поможете решить сию проблему
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.04.2011, 19:41
Ответы с готовыми решениями:

Полиморфизм
Значит вот выдумал только что такой вот пример дабы обрести понимание полиморфизма. Скажите...

Полиморфизм
Всем привет...Проблема в такой задачке, вот условие... В окне приложения первоначально...

Полиморфизм
Здравствуйте, я не могу понять как сделать полиморфизм 2-х методов в C#. Что это такое я понимаю, а...

Полиморфизм
Здравствуйте. Изучал ООП как в C#, так и в Python, но нигде не могу понять, что такое полиморфизм....

17
мастер топоров
916 / 741 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
17.04.2011, 19:56 2
попробуйте аргументом метода принимать не тип Person, а object. при этом в классах-наследниках этот метод реализовывать таким способом чтобы в теле реализации метода было приведение аргумента от object к нужному вам типу(Teacher или же Student в зависимости от класса-наследника)
или же вам нужно именно на таком примере показать работу полиморфизма?
0
145 / 145 / 3
Регистрация: 25.03.2011
Сообщений: 512
17.04.2011, 19:56 3

Не по теме:

Сорь, не то)



У тебя кажется множественное наследование в коде, по мойму так нельзя.
0
1 / 1 / 2
Регистрация: 21.12.2010
Сообщений: 34
17.04.2011, 20:03  [ТС] 4
wade25, Ну почему же, множественное наследование - это когда у одного класса 2 предка, а не наоборот.
Koran, спасибо, попробую
0
мастер топоров
916 / 741 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
17.04.2011, 20:05 5
wade25, множественное наследование в C# поддерживается только в виде наследования от нескольких интерфейсов либо от класса и нескольких интерфейсов, но не от классов. множественное наследование от классов реализовано в С++ на сколько мне известно
0
145 / 145 / 3
Регистрация: 25.03.2011
Сообщений: 512
17.04.2011, 20:07 6
Цитата Сообщение от Koran Посмотреть сообщение
wade25, множественное наследование в C# поддерживается только в виде наследования от нескольких интерфейсов либо от класса и нескольких интерфейсов, но не от классов. множественное наследование от классов реализовано в С++ на сколько мне известно

Не по теме:

Ступил :)

0
1 / 1 / 2
Регистрация: 21.12.2010
Сообщений: 34
17.04.2011, 20:20  [ТС] 7
Koran, мне нужно показать просто, что один и тот же метод в разных классах имеет разную реализацию. И кстати, прошлая ошибка исчезла, но пошаговое выполнение программы показало ошибку "Object reference not set to an instance of object" (ссылка на объект не указывает на экземпляр объекта) в методе
C#
1
2
3
4
5
6
7
8
public override void PrepareToExam()
        {
           Random rand = new Random();
           for (int i = 0; i < 25; i++)
           {
               bilet[i] = rand.Next(20, 115);//а именно здесь
           }
        }
0
мастер топоров
916 / 741 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
17.04.2011, 20:41 8
Цитата Сообщение от Maxximus Посмотреть сообщение
мне нужно показать просто, что один и тот же метод в разных классах имеет разную реализацию
это немного не полиморфизм
Полиморфизм (polymorphism) позволяет присваивать переменную базового типа переменной одного из производных типов.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    abstract class a { 
        public int[] iArray;
        public abstract void ToDo();
    }
    class b : a {
        public b() {
            iArray = new int[25];
        }
        public override void ToDo() {
            foreach (int i in iArray) {
                Console.WriteLine(i);
            }
        }
    }
    class Programm {
        static void Main(string[] args) {
            a A = new b();
            A.ToDo();
            Console.ReadKey();
        }
    }
ошибка возникает при прохождении по массиву?
0
1 / 1 / 2
Регистрация: 21.12.2010
Сообщений: 34
17.04.2011, 20:45  [ТС] 9
Идет первый раз прохождение указанной строчки кода (rand.Next())и сразу выкидывает на catch
0
мастер топоров
916 / 741 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
17.04.2011, 20:46 10
немогли бы вы показать ещё реализацию метода мейн? тоесть сам код программы, не только классов
0
Неадекват
1492 / 1230 / 246
Регистрация: 02.04.2010
Сообщений: 2,789
17.04.2011, 20:46 11
Вот исправленная версия кода. На месте return'ов (строки 77 и 44) обработку ошибок вставить.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace polymorf
{
    abstract class Person
    {
        public int[] bilet;
        public string status;
        public int IQ, tails, age;
        public bool check;
        protected string name;
        public abstract void PrepareToExam();
        public abstract void Exam(Person b);
    }
    
    class Student : Person
    {
 
        public Student()
        {
            name = "Noname";
            age = 0;
            status = "studying"; 
            IQ = 0; 
            tails = 0; 
            check = true; 
        }
       public Student(string name, int age, string status, int IQ)  { 
           this.status = status; this.IQ=IQ;
           check = true; tails = 0;
           this.name = name;
           this.age = age;
       }
       public override void PrepareToExam()
       {
          IQ = IQ + 10;
       }
       public override void Exam(Person b)//и здесь ошибка
       {
            if (!(b is Teacher)) return;
            Random rand = new Random();
            int i = rand.Next(0, 24);
            if (IQ < b.bilet[i])
            {
               check = false;
            }
            else
            { check = true; }
 
       }
       public override string ToString()
       {
           return "Student " + name + " ," + age.ToString() + " years is " + status ;
       }
    }
    
    class Teacher : Person
    {
        public Teacher()  
        {
            name = "Noname";
            age = 0;
            int[] bilet = new int[25];
        }
        public Teacher(string name, int age)
        {
            this.name = name;
            this.age = age;
            int[] bilet = new int[25];
        }
        public override void Exam(Person b)//здесь ошибка
        {
            if (!(b is Student)) return;
            if (b.check == false)
            {
                b.tails++;
            }
        }
        public override void PrepareToExam()
        {
           Random rand = new Random();
           for (int i = 0; i < 25; i++)
           {
               bilet[i] = rand.Next(20, 115);
           }
        }
    }
}
это немного не полиморфизм
Это совсем не полиморфизм.
0
1 / 1 / 2
Регистрация: 21.12.2010
Сообщений: 34
17.04.2011, 20:50  [ТС] 12
Main
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Person[] per = new Person[7];
                per[0] = new Student("Petro", 16, "studying", 80);
                per[1] = new Teacher("Vera", 36);
                per[1].PrepareToExam();
                per[0].PrepareToExam();
                per[0].Exam(per[1]);
                Console.WriteLine(per[0].ToString());
            }
            catch (Exception e)
            { Console.WriteLine(e); }
            Console.ReadKey(true);
        }
    }
}
0
Неадекват
1492 / 1230 / 246
Регистрация: 02.04.2010
Сообщений: 2,789
17.04.2011, 20:52 13
Цитата Сообщение от Maxximus Посмотреть сообщение
Person[] per = new Person[7];
Массив абстрактных классов? Хм...О_о
0
мастер топоров
916 / 741 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
17.04.2011, 21:07 14
freeba, а че мешает сделать такой массив?
или вообще массив такого типа:
C#
1
IDisposable[] id = new IDisposable[2];
вы же не создаете объекты, а только массив
0
Неадекват
1492 / 1230 / 246
Регистрация: 02.04.2010
Сообщений: 2,789
17.04.2011, 21:17 15
Koran, Я не невозможность имел ввиду, это опасный стиль программирования. Я бы по другому пути пошел. Но в данном случае такой подход вполне оправдан.
0
Эксперт С++
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
17.04.2011, 21:22 16
Ниче не опасный
0
мастер топоров
916 / 741 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
17.04.2011, 21:29 17
freeba, в данном случае это некритично
Maxximus, вот вам
полиморфизм и поедание машинами машин
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
using System;
 
namespace MyProgram {
    abstract class Mechan {
        public string name;
        public int weight;
        public abstract void Eat(Mechan m, int count);
    }
    class LittleCar : Mechan {
        public LittleCar(string name, int weight) {
            this.name = name;
            this.weight = weight;
            Console.WriteLine(this);
        }
        public override void Eat(Mechan m, int count) {
            BigCar n = (BigCar)m;
            for (int i = 0; i < count; i++) {
                this.weight += n.weight;
            }
        }
        public override string ToString() {
            return this.name + " - " + this.weight + " kg";
        }
    }
    class BigCar : Mechan { 
        public BigCar(string name, int weight) {
            this.name = name;
            this.weight = weight;
            Console.WriteLine(this);
        }
        public override void Eat(Mechan m, int count) {
            LittleCar n = (LittleCar)m;
            for (int i = 0; i < count; i++) {
                this.weight += n.weight;
            }
        }
        public override string ToString() {
            return this.name + " - " + this.weight + " kg";
        }
    }
    class Programm {
        static void Main(string[] args) {
            Mechan little = new LittleCar("Jossi", 100);
            Mechan big = new BigCar("Betsy", 300);
            Console.WriteLine();
            big.Eat((Mechan)little, 10);
            Console.WriteLine(big);
            little.Eat((Mechan)big, 10);
            Console.WriteLine(little);
            Console.ReadLine();
        }
    }
}
0
Неадекват
1492 / 1230 / 246
Регистрация: 02.04.2010
Сообщений: 2,789
17.04.2011, 21:48 18
Вот этот пример мне больше нравится. И описание подробное.
0
17.04.2011, 21:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.04.2011, 21:48
Помогаю со студенческими работами здесь

Полиморфизм
Задание : Расширить иерархию классов из лабораторной работы №2 (см. ниже )с использованием...

полиморфизм
using System; class A { public String Call() { return &quot;A&quot;; } } class B

Полиморфизм
Создать базовый класс — фигура, и производные классы: круг, прямоугольник, трапеция. Определить...

Полиморфизм в массиве
Есть два класса,один из которых наследуется от другого,также есть массив объектов родительского...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru