У меня с товарищем возникли разногласия по поводу правильности наследования интерфейсов c точки зрения архитектуры. Есть два интерфейса, один является наследником другого.
Родительский:
public interface IFirst
{
int Weight
{
get;
}
}
Дочерний:
public interface ISecond : IFirst
{
new double Weight
{
get;
}
}
Дело в том,что в дочернем интерфейсе меняется тип свойства.
Я считаю что это правильное наследование, при условии, что оба интерфейса одновременно не будут явлеться родителями одного и того же класса.
Не правильно...
т.к. я при получив объект типа ISecond буду чесать репу — а чему же присвоить его значение...
собственно по этому нет и перегрузки возвращаемых значений, тогда как перегрузка передаваемых значений есть.
ну и вообще не очень это красиво, т.к. источник багов.
Здравствуйте, ruccoder, Вы писали:
R>У меня с товарищем возникли разногласия по поводу правильности наследования интерфейсов c точки зрения архитектуры. Есть два интерфейса, один является наследником другого.
Я считаю, что это совершенно неправильное наследование. Более того, я считаю все эти игры с new — крайне вредными. Далее, фраза "интерфейс является родителем класса" — исключительно некорректна и вводит в заблуждение. Верной будет — "класс реализует интерфейс".
Здравствуйте, ruccoder, Вы писали:
R>У меня с товарищем возникли разногласия по поводу правильности наследования интерфейсов c точки зрения архитектуры. Есть два интерфейса, один является наследником другого.
R>Дело в том,что в дочернем интерфейсе меняется тип свойства.
R>Я считаю что это правильное наследование,
а я — нет. Зачем здесь вообще наследование? Какой смысл оно имеет? R>при условии, что оба интерфейса одновременно не будут явлеться родителями одного и того же класса.
Это условие невыполнимо. Наследование как раз и означает, что если ты взялся реализовывать ISecond, то обязан реализовывать IFirst. R>Как Вы считаете?
Подобное наследование оправдано в редких случаях, когда ISecond играет ту же роль, что и IFirst, а поддержка IFirst нужна в целях обратной совместимости со старым кодом.
См. например IEnumerable<T>: IEnumerable, IList<T> : IList и т.п.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, ruccoder, Вы писали:
R>Дело в том,что в дочернем интерфейсе меняется тип свойства.
R>Я считаю что это правильное наследование, при условии, что оба интерфейса одновременно не будут явлеться родителями одного и того же класса.
R>Как Вы считаете?
Это аналогичные интерфейсы, а не родственные => соответственно отношение наследования между ними ни к месту.
Если хочется выразить общность имен, то как уже сказали нужно использовать Generics.
Здравствуйте, ruccoder, Вы писали:
R>У меня с товарищем возникли разногласия по поводу правильности наследования интерфейсов c точки зрения архитектуры. Есть два интерфейса, один является наследником другого.
дай этим полям разные имена, типа IWeight и DWeight, и работай с ними. иначе представь себе, что объёкт, реализующий второй (и автоматически первый) интерфейс, передаётся в функцию, работающую с первым — и в результате его вес неожиданно для пользщователя класса уменьшается на полкило. хорошо, если это будет прогррама слежения за весом. а если программа взвещивания золотых слитков? тебя же, как архитектора, на счётчик и поставят