Страницы

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

воскресенье, 15 декабря 2019 г.

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

#c_sharp


Есть класс 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.
    


Ответы

Ответ 1



Для этой ситуации хорошо подойдёт 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 }

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

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