Здравствуйте, Sharov, Вы писали:
S>S> public interface IEatableBy<TEater>
S> where TEater : Entity
S> {
S> void BeEatenBy(TEater animal);
S> }
S> public class Entity
S> {
S> }
S> public class Animal : Entity { }
S> public abstract class Animal<TVictim>
S> //моя жертва съедаема мной самим
S> where TVictim : IEatableBy<Entity>
S> {
S> /// <summary>
S> /// жертвы
S> /// </summary>
S> protected HashSet<TVictim> Victims;
S> }
S>Либо убрать ограничение у интерфейса, что логичнее. Пожирается кем-то или чем-то, ну и ладно.
Оба случая не подходят под ограничение, что растения должны поедаться только травоядными. Если убрать ограничение у интерфейса, то можно задать, чтобы растение съедалось растениями. Если использовать код выше, то классы должны быть такими
public class Herbivore : Animal<Plant>, IEatableBy<Entity>
{ }
public class Predator : Animal<Herbivore>
{ }
public class Plant : IEatableBy<Entity>
{ }
то есть Herbivore и Plant оба реализуют IEatableBy<Entity> , то есть их съедает Entity, но Entity — это любое животное, а нужно, чтобы травоядное съедалось только хищниками, а растения только травоядными.
S>Либо убрать ограничение у интерфейса, что логичнее. Пожирается кем-то или чем-то, ну и ладно.
Неужели на практике так всегда и делается? Но если не будет нормальной типизации, то я же могу ошибиться и передать в Растение в качестве едящего Хищника, в результате программа не будет работать, как нужно. В общем, как-то странно, неужели си шарп настолько плох, что там нельзя никак типизировать данные в этом случае?