Скажем, у меня есть простая цепочка наследования, где Employee
- это абстрактный базовый класс, а Checkout
и Manager
наследуют его в этом чисто иллюстративном консольном приложении. Теперь я хочу иметь метод, который будет принимать объект типа Manager
или Checkout
и вернуть целочисленную сумму бонуса в зависимости от позиции в компании сотрудника. У меня были некоторые первоначальные мысли по этому поводу, и я хотел бы знать потенциальные долгосрочные дефициты или выгоды от каждого подхода, если это консольное приложение должно было в один прекрасный день стать веб-приложением, управляемым данными.Абстрактный метод против статического метода в классе программы
Используйте интерфейс, общий для унаследованных классов. Мой базовый класс выглядит
abstract class Employee { public int EmployeeId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } }
и мои производные классы реализуют интерфейс, предназначенный для печати информации сотрудника на консоль под названием
IPrintable
и имеет только один способ сделать это. Хотя этот интерфейс не имеет ничего общего с предоставлением бонусов, я высмеивал следующее в классе с моим жизненным цикломMain
, и программа работает нормально.static int GiveBonusesViaInterface(IPrintable i) { if (i is Checkout) return 1000; else return 2000; }
Мне кажется, что если бы я хотел использовать интерфейс для этого я, вероятно, следует сделать еще один специфический для предоставления прибавки вместо верхом на фалды на уже реализованный интерфейс (но это уже другой вопрос, на другой день).
Используйте статический метод в базовом классе как
public static int GiveBonus(Employee e) { if (e is Manager) return 2000; else return 1000; }
Сделать абстрактный метод в абстрактном базовом классе и неф производные классы реализуют, как они считают нужным
abstract class Employee //fields and constructors { public abstract int GiveBonusesViaAbstractMethod(Employee e); }
Мне кажется, это наихудшая идея, потому что в каждом производном классе должен быть метод, который принимает параметр IPrintable
или Employee
и в классе менеджера мы должны были бы проверить, есть ли у сотрудника is-a
Manager.
Являются ли 1-2 одинаково масштабируемыми и управляемыми для долгосрочного веб-приложения? Действительно ли вариант 3 так же плох, как я это сделал?
Я думаю, что существующий подход (с использованием интерфейса) лучше других –
О, нет, это становится все хуже. Не распространяйте свою логику и определенно не ставьте ее в свой статический класс с помощью «Main». Написание статического метода в порядке, но поместите его в абстрактный класс Employee, если у вас должен быть метод вообще. –