Re[6]: Круговые ссылки в генериках
От: gamburger  
Дата: 02.02.18 20:49
Оценка:
Здравствуйте, 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>Либо убрать ограничение у интерфейса, что логичнее. Пожирается кем-то или чем-то, ну и ладно.


Неужели на практике так всегда и делается? Но если не будет нормальной типизации, то я же могу ошибиться и передать в Растение в качестве едящего Хищника, в результате программа не будет работать, как нужно. В общем, как-то странно, неужели си шарп настолько плох, что там нельзя никак типизировать данные в этом случае?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.