Я совсем запутался.Я наткнулся на правила подписи (на которые ссылается также Б.Лисков в своей работе), в которых говорится:
Противопоставление аргументов. m1 и m2 имеют одинаковое количество аргументов.Если список типов аргументов m1 равен a , а список m2 равен b , то ∀i. a i <<em> b i // означает, что a является подтипом b .
Из другого учебного материала:
Чтобы тип функции DY → CY был подтипом (т. Е. Заменяемым) DX → CX, мы должен быть ковариантным в типе результата, но противоречивым в типе аргумента!
Значит ли это, что я никогда не делаю правильный подтип, если использую только те же типы аргументов и возвращаемые типы?Я не понимаю, учитывается ли использование одного и того же типа, то есть, когда я использую один и тот же тип для аргументов метода родительского и дочернего класса, является ли это контравариантным?
Другими словами, так как c # не допускает противоречивость аргументов, значит ли это, что мой код никогда не совместим с LSP?Когда я прочитал, что LSP требует, чтобы аргументы были контравариантными.
class Person
{
}
class Employee: Person
{
}
class PersonRegister
{
GetJobTitle(Employee e) {return e.JobTitle;}
}
class DeriverRegister: PersonRegister
{
GetJobTitle(Person p) //contravariance, using less derived type, cannot be done in C#
}
Как это могло бы работать, если, например, у менее производного типа нет требуемого поля, в этом примере JobTitle?Это собственность Сотрудника, но обязательно Лица.