Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
1 / 1 / 0
Регистрация: 23.12.2010
Сообщений: 24

Виртуальные методы. Перекрытие методов.

23.12.2010, 16:01. Показов 3660. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Гетерогенная ЛВС состоит из различных устройств: коммутаторы, маршрутизаторы,
хосты, принтера. Взаимодействие между объектами строится по принципу запрос-ответ.
Идентификация устройств производится по уникальному адресу. Разработать иерархию
классов для моделирования работы объектов сети. Создать функциональность в базовом
классе устройства и перекрыть ее в производных классах.

Помогите пожалуйста решить...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.12.2010, 16:01
Ответы с готовыми решениями:

Виртуальные методы и наследование
Здраствуйте. Не могли бы вы помочь добавить к этой программе наследование и виртуальные методы? using System; using...

Upcasting и виртуальные методы
Всем привет Догадываюсь что сабж баян, но все-таки, оооочень прошу знающих "разжевать" что именно происходит в коде: class...

Виртуальные статические методы
вычитал на стэковерфлоу что их не предусмотрено, т.к. противоречат принципам ооп и т.д.т.д. но например, есть класс, представляющий...

6
 Аватар для Filislav
339 / 285 / 62
Регистрация: 02.09.2010
Сообщений: 547
23.12.2010, 19:28
Я тебе пока только наметки дам, наверное сам начнешь?Создай абстрактный класс "Устройство" и укажи поля которые встречаются в каждом устройстве сети, например mac адрес, ip адрес и методы которые реализуют запрос и ответ т.д. А потом создай производные от него классы "Маршрутизатор", "Принтер" которые реализуют помимо базовых свои уникальные методы, типа печать, выбор маршрута и т.д.
1
1 / 1 / 0
Регистрация: 23.12.2010
Сообщений: 24
23.12.2010, 20:41  [ТС]
Ок, сейчас начну делать, потом спрошу, что дальше делать

Добавлено через 1 час 7 минут
Чет я уперся, не понимаю, что дальше делать. Это класс "Устройства":

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace tretya
{
    abstract class Ustroistvo
    {
        private double mac;
        private double ip;
        public double Mac
        {
            get { return mac; }
            set { this.mac = value; }
        }
        public double Ip
        {
            get { return ip; }
            set { this.ip = value; }
        }
 
        public abstract double Zapros();
        public abstract double Otvet();
    }
}
Других пока не создавал.
0
 Аватар для Filislav
339 / 285 / 62
Регистрация: 02.09.2010
Сообщений: 547
23.12.2010, 21:09
Метод пишется

C#
1
2
3
4
 public double Zapros()
{
 
}
В твоем случае он должен возвращать значение типа double.
Можно такой метод написать.
C#
1
2
3
4
 public void Zapros()
{
Console.WriteLine("Реализуется запрос");
}
Добавлено через 3 минуты
По аналогии напиши "ответ". Затем создаешь наследников, придумываешь им уникальные методы. И вроде все иерархия классов готова.
0
1 / 1 / 0
Регистрация: 23.12.2010
Сообщений: 24
23.12.2010, 22:27  [ТС]
Спасибо, исправил.

Цитата Сообщение от Bas916 Посмотреть сообщение
Создать функциональность в базовом
классе устройства и перекрыть ее в производных классах.
А это как реализовать?
0
 Аватар для Unril
826 / 717 / 110
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
24.12.2010, 12:31
Значится так.
Класс устройства:
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
using System;
 
namespace ConsoleApplicationTest
{
    /// <summary>
    /// Сетевое устройство.
    /// </summary>
    public abstract class Device
    {
        /// <summary>
        /// Событие ответа.
        /// </summary>
        public Action<DataPackage> ResponseEventHandler;
 
        /// <summary>
        /// Создание сетевого устройства.
        /// </summary>
        /// <param name="id">Уникальный идентификтор устройства.</param>
        protected Device(int id)
        {
            Id = id;
        }
 
        /// <summary>
        /// Уникальный идентификатор устройства.
        /// </summary>
        public int Id { get; private set; }
 
        /// <summary>
        /// Запрос к устройству.
        /// </summary>
        public void Request(DataPackage dataPackage)
        {
            OnRequest(dataPackage);
        }
 
        /// <summary>
        /// Посылка ответа.
        /// </summary>
        protected void SendResponse(DataPackage responseData)
        {
            if (ResponseEventHandler != null)
                ResponseEventHandler(responseData);
        }
 
        /// <summary>
        /// Событие, возникающее при получении запроса.
        /// </summary>
        protected abstract void OnRequest(DataPackage dataPackage);
    }
}
Класс принтера:
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
using System;
 
namespace ConsoleApplicationTest
{
    /// <summary>
    /// Принтер
    /// </summary>
    public class Printer : Device
    {
        /// <summary>
        /// Создание принтера.
        /// </summary>
        /// <param name="id">Идентификатор принтера.</param>
        public Printer(int id) : base(id) {}
 
        protected override void OnRequest(DataPackage dataPackage)
        {
            if (dataPackage.ReceiverId == Id)
            {
                if (dataPackage.Data == "print document")
                    Print();
            }
        }
 
        /// <summary>
        /// Печать документа.
        /// </summary>
        private void Print()
        {
            Console.WriteLine("Printer {0}: Печать документа", Id);
        }
    }
}
Класс компьютера:
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
using System;
 
namespace ConsoleApplicationTest
{
    /// <summary>
    /// Локальный компьютер.
    /// </summary>
    public class Computer : Device
    {
        /// <summary>
        /// Создание компьютера.
        /// </summary>
        /// <param name="id">Идентификатор компьютера.</param>
        public Computer(int id) : base(id) {}
 
        /// <summary>
        /// Показать сообщение.
        /// </summary>
        private void ShowMessage()
        {
            Console.WriteLine("Computer {0}: Показывает сообщение.", Id);
        }
 
        /// <summary>
        /// Послать команду устройству.
        /// </summary>
        /// <param name="id">Идентификатор того, кому нужно послать сообщение</param>
        /// <param name="command">Посылаемая команда.</param>
        public void SendCommand(int id, string command)
        {
            SendResponse(new DataPackage(Id, id, command));
        }
 
        protected override void OnRequest(DataPackage dataPackage)
        {
            if (dataPackage.ReceiverId == Id)
            {
                if (dataPackage.Data == "show message")
                    ShowMessage();
            }
        }
    }
}
Класс коммутатора:
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
using System;
using System.Collections.Generic;
 
namespace ConsoleApplicationTest
{
    /// <summary>
    /// Сетевой коммутатор
    /// </summary>
    public class Switch : Device
    {
        /// <summary>
        /// Tаблица маршрутизации, задаёт соответствие устройства идентификатору.
        /// </summary>
        private readonly Dictionary<int, Device> _routingTable;
 
        /// <summary>
        /// Создание коммутатора.
        /// </summary>
        /// <param name="id">Идентификатор коммутатора.</param>
        public Switch(int id) : base(id)
        {
            _routingTable = new Dictionary<int, Device>();
        }
 
        /// <summary>
        /// Подключить устройство к коммутатору.
        /// </summary>
        /// <param name="device">Подключаемое устройство.</param>
        public void ConnectDevice(Device device)
        {
            // Если такое устройство ещё не подключено.
            if (!_routingTable.ContainsKey(device.Id))
            {
                // Добавляем устройство в таблицу.
                _routingTable.Add(device.Id, device);
                // Добавляем событие, возникающее при ответе устройства.
                device.ResponseEventHandler += OnRequest;
            }
        }
 
        protected override void OnRequest(DataPackage dataPackage)
        {
            if (_routingTable.ContainsKey(dataPackage.ReceiverId))
                _routingTable[dataPackage.ReceiverId].Request(dataPackage);
        }
    }
}
Диаграмма классов:

Собственно, класс тестирования всего этого:
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
#region using
 
using System;
 
#endregion
 
namespace ConsoleApplicationTest
{
    public static class Program
    {
        private static void Main()
        {
            // Создаём принтер.
            Device printer = new Printer(10);
            Console.WriteLine(" -Посылаем принтеру запрос на печать.");
            printer.Request(new DataPackage(0, 10, "print document"));
 
            // Созадём компьютер.
            var computer = new Computer(20);
            Console.WriteLine(" -Посылаем компьютеру запрос на показ сообщения.");
            computer.Request(new DataPackage(0, 20, "show message"));
 
            // Создаём коммутатор.
            var switchboard = new Switch(1);
 
            // Подключаем к нему принтер и компьютер.
            switchboard.ConnectDevice(printer);
            switchboard.ConnectDevice(computer);
 
            Console.WriteLine(" -Посылаем коммутатору запрос к принтеру.");
            switchboard.Request(new DataPackage(0, 10, "print document"));
 
            Console.WriteLine(" -Посылаем коммутатору запрос к компьютеру.");
            switchboard.Request(new DataPackage(0, 20, "show message"));
 
            Console.WriteLine(" -Посылаем с компьютера запрос принтеру.");
            computer.SendCommand(10, "print document");
 
            // Создаём ещё один компьютер.
            var secondComputer = new Computer(21);
            // Подключаем к коммутатору.
            switchboard.ConnectDevice(secondComputer);
            Console.WriteLine(" -Посылаем со второго компьютера запрос первому компьютеру.");
            computer.SendCommand(20, "show message");
 
            Console.ReadKey();
        }
    }
}
Всё вместе: ConsoleApplicationTest.zip
2
1 / 1 / 0
Регистрация: 23.12.2010
Сообщений: 24
24.12.2010, 13:03  [ТС]
Unril, спасибо тебе ОГРОМНОЕ. Очень выручил, мне сегодня сдавать проекты нужно, я думал из 5-ти только 2 сдам((( А так хоть 3, уже лучше Еще раз спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.12.2010, 13:03
Помогаю со студенческими работами здесь

Полиморфизм. Виртуальные методы
Здраствуйте уважаемые админы!!У меня проблемы:swoon: с некоторыми предметами,у меня к вам очень большая просьба помогите с лабой...

Скрыть виртуальные наследуемые методы
Делаю кароч либу, но вот хочу у наследуемых классов скрыть методы от родительского класса. Ну вот тип пример class Parent ...

Виртуальные методы и юнит-тесты
В C# пришел недавно из Java, где все методы виртуальные. И сразу столкнулся с тем, что в C# по умолчанию методы невиртуальные, более того,...

Виртуальные методы,с комментариями пожалуйста
Родительский класс:Вектор(поле-название) Потомки: (Двумерный вектор(поля:компоненты вектора), Трехмерный вектор(поле размерность)). ...

Позднее связывание и виртуальные методы
Добрый день. Возник вопрос по поводу позднее связывания в c#. В с++ п.с. можно организовать следующим образом: class A: { public: ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru