Страницы

Поиск по вопросам

четверг, 25 октября 2018 г.

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

Есть класс Tree, у него есть свойство Mass
class Tree { public decimal Mass {get; set;} }
Есть класс Apple, наследуемый от Tree
class Apple : Tree { }
Добавляю в класс Tree перегрузку оператора +
public static Tree operator +(Tree tree1, Tree tree2) { Tree result = new Tree(); result.Mass = tree1.Mass + tree2.Mass; return result; }
Какого типа будет объект apple3 в следующем фрагменте?
Apple apple1 = new Apple {Mass = 20}; Apple apple2 = new Apple {Mass = 30}; var apple3 = apple1 + apple2;
Предполагаю, что типа Tree. А как сделать, чтобы реализация перегрузки осталась в Tree, а в результате получать Apple? Цель - не писать реализацию для каждого наследника Tree


Ответ

Для этой ситуации хорошо подойдёт CRTP
class Tree where TChild : Tree, new() { public decimal Mass { get; set; }
public static TChild operator +(Tree tree1, Tree tree2) { var result = new TChild(); result.Mass = tree1.Mass + tree2.Mass; return result; } }
class Apple : Tree { }
static void Main(string[] args) { Apple apple1 = new Apple { Mass = 20 }; Apple apple2 = new Apple { Mass = 30 }; Apple apple3 = apple1 + apple2; // можно присвоить результат сложения в переменную типа Apple }

Комментариев нет:

Отправить комментарий