Пара друзей обсуждала использование наследования и как проверить, относится ли подкласс к определенному типу, и мы решили разместить его здесь, в стеке. Спор был о том, следует ли вам реализовать абстрактный перечисление в базовом классе, который будет использоваться для проверки типа подкласса, или использовать оператор is.
Alt 1.
public abstract class Document{
}
public class PDF:Document{
}
Check: If (myobj is PDF)
Alt 2.
public abstract class Document{
public abstract DucumentType TypeOfDocument {get;}
}
public class PDF:Document{
public DucumentType TypeOfDocument { get{return DucumentType.PDF };}
}
public enum DucumentType{
PDF, Word
}
Check: If (myobj.TypeOfDocument == DucumentType.PDF)
Те, что для Alt1. Учитывая, что Alt2 слегка нарушает SRP, вы не пользуетесь OO, тем самым повторяя абстракцию. Поскольку наследование является самой сложной связью между классами, вы не можете не знать о них, и если вам необходимо пройти через наследование, минимизируйте влияние. Alt2 также ломает DRY
Те, для Alt2 помнят, что Alt2 будет полностью удалять проверку типов и заменять ее опцией проверки этого перечисления. Удаление всех жестких соединений со всеми подклассами и значение самого перечисления ничего не говорит о том, над какой конкретной реализацией в настоящее время работает.
Что вы думаете о двух альтернативах?
Никаких обсуждений наследования и состава и так далее, это другой вопрос!