Мне кажется, что ваша логика ошибочна, и, независимо от влияния на производительность, вызов пустого метода пахнет плохим дизайном.
В вашей ситуации у вас есть один интерфейс, который Of Person
.Вы утверждаете, что для того, чтобы быть человеком, вы должны быть в состоянии стареть, что обеспечивается вашим методом AgeAYear
.Однако, согласно логике в вашем методе AgeAYear (или его отсутствии), ImmortalPerson
не может стареть, но все же может быть Person
.Ваша логика противоречит самой себе.Вы можете атаковать эту проблему несколькими способами, но это первое, что приходит мне в голову.
Один из способов сделать это - настроить два интерфейса:
interface IPerson { void Walk(); }
interface IAgeable : IPerson { void AgeAYear();}
ВыТеперь можно четко различить, что вам не нужно стареть, чтобы быть человеком, но чтобы стареть, вы должны быть человеком.Например,
class ImmortalPerson : IPerson
{
public void Walk()
{
// Do Something
}
}
class RegularPerson : IAgeable
{
public void AgeAYear()
{
// Age A Year
}
public void Walk()
{
// Walk
}
}
Таким образом, для вашего RegularPerson
, реализуя IsAgeable
, вам также необходимо реализовать IPerson
.Для вашего ImmortalPerson
вам нужно всего лишь реализовать IPerson
.
Затем вы можете сделать что-то, как показано ниже, или его вариант:
List<IPerson> people = new List<IPerson>();
people.Add(new ImmortalPerson());
people.Add(new RegularPerson());
foreach (var person in people)
{
if (person is IAgeable)
{
((IAgeable)person).AgeAYear();
}
}
Учитывая приведенную выше настройку, вашпо-прежнему следят за тем, чтобы ваши классы реализовывали IPerson
, чтобы считаться личностью, но могут быть только в возрасте, если они также реализуют IAgeable
.