0 / 0 / 0
Регистрация: 20.07.2015
Сообщений: 89

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

09.07.2021, 18:37. Показов 910. Ответов 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 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru