В новых версиях языка ввели расширенный оператор switch, обозвали его "pattern matching", и рекламируют примерно так:
static string M(Person person)
{
switch (person)
{
case Professor p:
return $"Dr. {p.LastName}";
case Studen s:
return $"{s.FirstName} {s.LastName} ({s.Level})";
default:
return $"{person.FirstName} {person.LastName}";
}
}
(взято
отсюда)
Вопрос первый: в чем принципиальная новизна, которая заслуживает специального термина "pattern matching", ведь это можно было проделать и раньше, используя is/as и if/else, хоть и более громоздко?
То есть, это просто синтаксический
оверхед сахар?
Вопрос второй: зачем это вообще нужно в ООП-языке? Я понимаю, что сейчас шарп дрифтует в сторону функциональщины, но ведь основой всё равно остаётся ООП. С моей точки зрения, в стиле ООП надо было сделать как-то так:
abstract class Person
{
public string FirstName {get;set;}
public string LastName {get;set;}
public virtual string GetDisplayString()
{
return $"{FirstName} {LastName}";
}
}
class Professor: Person
{
public override string GetDisplayString()
{
return $"Dr. {LastName}";
}
}
class Student: Person
{
public int Level {get;set;}
public override string GetDisplayString()
{
return $"{FirstName} {LastName} ({Level})";
}
}
...
static string M(Person person)
{
return person.GetDisplayString();
}
Здесь и модульность (можно отдельно добавлять классы), и удобство поддержки многих точек выбора (ветвление неявно осуществляет компилятор).
Новый способ банально провоцирует писать плохой код, да еще и с большим удобством