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

Реализация одного и того же интерфейса в классах наследниках

09.07.2021, 18:37. Показов 906. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. У меня есть базовый и производный класс, они оба реализуют один и тот же интерфейс IPrint. Я создаю объект производного класса и могу спокойно получить его реализацию интерфейса. Далее мне нужно получить реализацию базового класса, я пытаюсь привестить к базовому классу и получить его интерфейс IPrint, однако метод выполняется по прежнему из производного класса. Как я могу это сделать?

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
public void DoTest() 
    {
        DerivedClass derivedClass = new DerivedClass();
 
        IPrint derivedPrint = derivedClass;
        IPrint basePrint = (BaseClass)derivedClass;
        
        basePrint.Print(); // Print from DerivedClass
        derivedPrint.Print(); // Print from DerivedClass
    }
 
 
    public class BaseClass : IPrint
    {
        public void Print()
        {
            Debug.Log("Print from BaseClass");
        }
    }
 
 
    public class DerivedClass : BaseClass, IPrint
    {
        public new void Print()
        {
            Debug.Log("Print from DerivedClass");
        }
    }
 
 
    public interface IPrint
    {
        void Print();
    }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.07.2021, 18:37
Ответы с готовыми решениями:

Реализация виртуального метода в двух классах-наследниках
Здравствуйте! Есть три класса, абстрактный CGraphicsObject, и два его наследника Circle и Parallelogram В CGraphicsObject содержится...

Массивы в классах-наследниках
Есть абстрактный базовый класс Base и два потомка D1 и D2. Я хочу, объявить в классе двумерный массив, int arr. Как сделать так, чтоб...

Повторный вызов конструктора в классах-наследниках
Всем приветики;) Хотела бы спросить...:- class Figure abstract { public: static constexpr double pi =...

2
 Аватар для esperanto_qun
1124 / 656 / 393
Регистрация: 28.01.2021
Сообщений: 1,336
09.07.2021, 19:28
C#
1
 BaseClass basePrint = derivedClass;
0
198 / 93 / 43
Регистрация: 09.11.2019
Сообщений: 414
09.07.2021, 19:46
Цитата Сообщение от urbemAngeli Посмотреть сообщение
У меня есть базовый и производный класс, они оба реализуют один и тот же интерфейс IPrint. Я создаю объект производного класса и могу спокойно получить его реализацию интерфейса. Далее мне нужно получить реализацию базового класса, я пытаюсь привести к базовому классу и получить его интерфейс IPrint, однако метод выполняется по прежнему из производного класса. Как я могу это сделать?
Вы намудрили с реализацией интерфейса. У вас и базовый класс, и производный реализует один и тот же интерфейс.
Более того, в классе-наследнике вы определяете новый метод Print через new.
Поэтому IPrint, приведённый к классу-наследнику, вызовет метод из класса-наследника просто потому что этот класс реализует интерфейс IPrint.
IPrint, приведённый к классу-родителю, так же вызовет метод из класса-потомка, потому что уже объяснял.

В Вашем случае, либо напишите
C#
1
2
BaseClass baseClass = derivedClass;
baseClass.Print();
Либо не морочьте голову(потому что Ваш случай совершенно неочевидный, кто откуда и что вызывает) и не реализуйте в классе-потомке тот же самый интерфейс, который реализуете в классе-родителе. Иначе внутренней реализацией Вы перекроете базовую.

Если Вам сильно хочется, чтоб в классе-потомке и родителе были одинаковые методы с разной реализацией, то поступите так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 public class BaseClass
        {
           public virtual void Print()
            {
                //реализация класса-родителя, которая будет вызываться, если использовать ссылку BaseClass
            }
        }
 
 public class DerivedClass : BaseClass
        {
            public override void Print()
            {
                //реализация класса-потомка, которая будет вызываться, если использовать ссылку DerivedClass
            }
        }
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.07.2021, 19:46
Помогаю со студенческими работами здесь

Как сделать поля приватными, но доступными в классах наследниках?
У меня есть код и name, age, food я хочу сделать приватным, но как надо написать, что бы не было ошибки? КОД: class Animals { ...

Почему нет доступа к данным-членам классов-родителей в классах-наследниках?
#include<string> using namespace std; class base { int i; public: base(int x) { i = x; } virtual void f() { cout << "This...

Реализация несколькими классами одного интерфейса
Выделенные классы должны реализовывать выделенный интерфейс. Я желаю получить результат, подобный изображенному здесь: одна стрелочка от...

Как увидеть методы в классах, которые реализованы из интерфейса и перейти в них из интерфейса?
Как увидеть методы класса, которые реализованы из интерфейса и перейти в них из этого интерфейса, то есть все классы где данный метод...

Реализация прерываний в классах на С++
Доброго дня всем. Изучая С++ для STM32 стлолкнулся со следующей проблемой. Не могу реализовать обработчик прерываний внутри класса....


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru