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

Перегрузка операторов при наследовании

04.06.2020, 18:25. Показов 3005. Ответов 7

Студворк — интернет-сервис помощи студентам
Здравствуйте! Начал изучать наследование и столкнулся с такой проблемой. Не получается перегрузить оператор подкласса.
Имеется ли возможность подклассу сказать что нужно использовать оператор родительского класса?
Или в таких случаях придется делать в лоб?

C#
1
2
one1.a = one.a + second.a;
one1.b = one.b + second.b;
Пробовал делать явное приведение к базовому классу, а потом полученный результат обратно к подклассу, но очевидно идея не рабочая. В С++ можно использовать using для подобных нужд, но как решить подобную проблемы в С# ?

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
public class One
{
     public int a;
     public static One operator +(One one, One second)
     {
         One one1 = new One();
         one1.a = one.a + second.a;
         return one1;
     }
 }
public class Two : One
{
      public int b;
      public static Two operator +(Two one, Two second)
      {
          Two one1 = new Two();
 
           one1 = (Two)((One)one + (One)second);// Ошибка
 
           return one1;
      }
 
 
 }
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.06.2020, 18:25
Ответы с готовыми решениями:

Поведение перегруженных операторов при наследовании
Добрый день! Существует некий класс Matrix. В нём перегружен оператор +. От него унаследован класс Vector. Возникает проблема с тем,...

Перегрузка операторов
Нету времени на исправление ошибки,вообщем обнуляются переменные в классе когда перегружаю + и ++. исправьте ошибки пожалуйста ...

Перегрузка операторов
Всем добрый день! В свободное время читаю Шилда "Полное руководство С# 4.0" (для каких конкретных целей еще не решил). Дошел до главы...

7
 Аватар для Enifan
1849 / 1191 / 501
Регистрация: 14.10.2018
Сообщений: 3,212
04.06.2020, 18:43
arsn99, как класс One должен обрабатывать переменную b если он о ней ничего не знает? Не помню что делает using в плюсах, но шарп сам по себе строго типизированный, здесь такое не прокатит (и правильно разрабы сделали). Именно такая типизация позволяет избежать ошибок (чего не скажешь о плюсах). К тому же в обоих классах тип int, а если бы в классе наследнике был бы тип string - базовый класс вообще никак не справился бы.
Как должна работать перегрузка у класса Two ? Сложить у обоих классов a и b ?
0
0 / 0 / 0
Регистрация: 05.05.2020
Сообщений: 3
04.06.2020, 18:51  [ТС]
Да сложить 'а' с 'а' и тоже самое с b. Я опустил в самой перегрузке класса Two сложение b, потому что с ним проблем нет)
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
04.06.2020, 19:02
Цитата Сообщение от arsn99 Посмотреть сообщение
В С++ можно использовать using для подобных нужд, но как решить подобную проблемы в С# ?
покажите кодом на плюсах как это, сразу будет понятно о чем речь
0
 Аватар для Enifan
1849 / 1191 / 501
Регистрация: 14.10.2018
Сообщений: 3,212
04.06.2020, 19:14
Лучший ответ Сообщение было отмечено arsn99 как решение

Решение

Вообще задача любопытная, прямых путей к ней нет, только используя нетрадиционных подходов.
Проблема в том, что в базовом классе могут быть поля private и sealed а это усложняет задачу в разы. Если с public то можно так. Опять таки, при большом наследовании это будет большое кол-во созданных никому не нужных объектов, что чревато по затратам памяти
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
using System;
 
public class One
{
    public int a;
    public static One operator +(One one, One second)
    {
        One one1 = new One();
        one1.a = one.a + second.a;
        return one1;
    }
}
 
public class Two : One
{
    public int b;
    public static Two operator +(Two one, Two second)
    {
        Two one1 = new Two();
 
        one1.a = ((One)one + (One)second).a;
        one1.b = one.b + second.b;
 
        return one1;
    }
 
 
}
 
class Program
{
    static void Main()
    {
        Two q = new Two() { a = 1, b = 10 };
        Two p = new Two() { a = 2, b = 20 };
 
        Two c = q + p;
        Console.WriteLine(c.a + " " + c.b);
 
        Console.ReadKey();
    }
}
1
0 / 0 / 0
Регистрация: 05.05.2020
Сообщений: 3
04.06.2020, 19:14  [ТС]
using One::operator+((One) one, (One) second);
Мне просто интересно возможно ли вообще организовать перегрузку сложение, используя при это перегрузку базового класса и в конце вернуть все в Two. Но как я понял, я несу какую то дичь.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
04.06.2020, 19:18
Цитата Сообщение от arsn99 Посмотреть сообщение
using One::operator+((One) one, (One) second);
нет, вы не поняли, покажите как он выполнится с классом two и не бросит точно так же исключение
0
172 / 91 / 36
Регистрация: 22.05.2020
Сообщений: 308
04.06.2020, 19:44
arsn99, такой подход является неэффективным. Представьте, что при каждом создании объекта класса One в конструкторе нужно произвести значительный объём вычислений. Подход, который вы хотите применить приведёт к тому, что для сложения двух объектов класса Two придётся вызывать конструктор One дважды: первый раз как часть оператора + базового, второй - производного. Обычно в таких случаях делают protected метод, давая возможность производным класса производить манипуляции с данными базового.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.06.2020, 19:44
Помогаю со студенческими работами здесь

Перегрузка операторов
это все одно задание. Очень прошу вашей помощи, завтра зачет практики, а я еще вин форм колупаюсь (4 практ. раб.), а операторы просто не...

Перегрузка операторов
Не до конца разобрался в этом вопросе. 1. "&" и "|" аналогичны "&&" и "||" для булевых выражений?(для целочисленных знаю что это...

Перегрузка операторов в с#
Создать класс "квадратное уравнение" с компонентными данными – коэффициентами. Перегрузить операции: ==, -, *= (умножить все коэффициенты...

Перегрузка операторов
Дошел до изучения перегрузки. Может решит кто-нибудь? Класс — одномерный массив. Дополнительно перегрузить следующую операцию != —...

Перегрузка операторов
Привет всем у меня есть программа в ней нужна сделать перегрузку операции && но как сделать правильно не знаю помогите плиз кто знает. ...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru