Проверка подкласса, проверка оператора или перечисления - PullRequest
0 голосов
/ 16 ноября 2009

Пара друзей обсуждала использование наследования и как проверить, относится ли подкласс к определенному типу, и мы решили разместить его здесь, в стеке. Спор был о том, следует ли вам реализовать абстрактный перечисление в базовом классе, который будет использоваться для проверки типа подкласса, или использовать оператор 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 будет полностью удалять проверку типов и заменять ее опцией проверки этого перечисления. Удаление всех жестких соединений со всеми подклассами и значение самого перечисления ничего не говорит о том, над какой конкретной реализацией в настоящее время работает.

Что вы думаете о двух альтернативах?

Никаких обсуждений наследования и состава и так далее, это другой вопрос!

Ответы [ 3 ]

3 голосов
/ 16 ноября 2009

Почему вы должны знать в первую очередь? Я согласен, что это иногда необходимо, но, где это возможно, вы должны сделать так, чтобы тип Document имел соответствующую абстрактную функциональность, чтобы специализация могла быть выполнена с помощью наследования, а не вызывающей стороне, чтобы обращаться с ней по-другому.

Я бы использовал подход enum только в том случае, если разные подклассы могут совместно использовать типы документов, но не желают использовать иерархию наследования. Это было бы довольно редко, IME.

0 голосов
/ 16 ноября 2009

У меня похожая ситуация, за исключением того, что в моем случае перечисление DocumentType должно увеличиваться при добавлении различных типов. Используя Enum, проверка типов намного лучше, но требует, чтобы «базовый» базовый класс перекомпилировался при каждом добавлении нового DocumentType.

Альтернатива, которую я сейчас обдумываю, заключается в использовании свойства интерфейса для возврата типа в виде STRING. Он не подходит для проверки типов, но остальная часть моего кода имеет необходимую проверку для предотвращения мошеннических объектов DocumentType. Я бы предпочел другое решение, но ничего не приходит в голову.

0 голосов
/ 16 ноября 2009

IMO, вы должны использовать оператор is. Он дает тот же результат, не портя (абстрактный) код класса.

...