Вы можете заставить тип, передаваемый в MoreFitThan
, соответствовать классу наследования, используя обобщенные значения следующим образом.
abstract class Entity<T> where T : Entity<T>
{
public abstract int Fitness(); //Bigger the number - more fit the entity is
public int MoreFitThan(T other)
{
return Fitness().CompareTo(other.Fitness());
}
}
class Fish : Entity<Fish>
{
public int swimSpeed { get; set; }
public override int Fitness()
{
return swimSpeed;
}
}
class Human : Entity<Human>
{
public int testPoints { get; set; }
public override int Fitness()
{
return testPoints;
}
}
Тогда следующее будет ошибкой компиляции
Human human = new Human() {testPoints = 10};
Fish fish = new Fish() { swimSpeed = 20 };
fish.MoreFitThan(human);
потому что Human
не является Fish
.Однако это позволило бы сравнить класс, унаследованный от Fish
, с Fish
.
class Trout : Fish
{
public int size { get; set; }
public override int Fitness()
{
return size;
}
}
Следующее работает, потому что Trout
является Fish
.
Trout trout = new Trout() {size = 10};
Fish fish = new Fish() { swimSpeed = 20 };
fish.MoreFitThan(trout);