Есть класс 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
public static TChild operator +(Tree
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
}
Комментариев нет:
Отправить комментарий