#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 Treewhere 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 }
Комментариев нет:
Отправить комментарий