RA-TA-TATA
типо это главная особенность?
Владислав
не
Владислав
это было наследование
Владислав
теперь имнкапсуляция
Владислав
.
Владислав
не все они ходят
Владислав
поэтому можно сказать, что вс еживотные двигаются
Владислав
каждому их них можно сказать двигаться
Владислав
а как они это сделают(полетят или сделают шаг - их проблемы, это нее важно)
Владислав
вообще в этом случае нужно делать abstract
Владислав
но и так сойдет
Владислав
теперь полиморйфизм
Владислав
и воробушку ясно, что Sparrow - животное
Владислав
и ему же ясно, что он есть и иногда умирает
Владислав
ест*
Владислав
если этих животных призовут в звериную армию
Владислав
то дял всех они будут просто зверями
Владислав
List<Animal>
Владислав
еслиму скзаали двигать, он двигается
Владислав
никому не важно коробей он или собака
Владислав
поэтому можно сделать так
Владислав
List<Animal> squad = new List<Animal>(): squad.Add(new Sparrow()); squad.Add(new Dog());
Владислав
приводить к типу не обязательно
Владислав
это компилятор и сам прекрасно поймет
Владислав
а вот чтобы привести обратно - обязательно
Владислав
причем можно приводить только если изначальный тип совпадает
Владислав
var a = new Dog(): var b = (Animal)a; var c = (Dog)b;
Владислав
иначе InvalidCastException
Владислав
насчет virtual
RA-TA-TATA
private void DoStep {} - метод?
Владислав
c virtual все просто переопределять можно 2 способами new и override если сделать override void Move(){ DoFlap(); } то после var a = (Animal)(new Dog()); у тебя при вызове a.Move() вызовется новый метод с Dog если new void Move(){ DoFlap(); } то уже вызовется старый метод, ибо ты его не переопределил, а поверх него написал
Владислав
да
RA-TA-TATA
он без () так и должно быть?
Владислав
нет
Владислав
опечаточка
Владислав
исправил
RA-TA-TATA
Так понимаю, если есть какой-то общий метод, к примеру ходить, но у дочерних классов он будет разный, то можно у главного класса приписать virtual, а дальше для классов наследников его переопределить?
Владислав
именно
RA-TA-TATA
А почему бы не сделать для каждого метод передвижения??
Владислав
а ты его не сделал?
Владислав
он у всех есть
RA-TA-TATA
а, virtual метод заполнить, понял
RA-TA-TATA
И будет по дефолту у всех, а можно переопределить
Владислав
да
RA-TA-TATA
Понял принял
Владислав
можно абстракт
Владислав
в абстрактном классе
Владислав
но там свои заморочки
Владислав
это все нужно, чтобы гарантировать наличие чего-либо в классе
Владислав
но это пережиткиjava
Владислав
ибо нормальные люди гарантирют наличие чего-либо интерфейсами
Владислав
в зависимости от ситуации
RA-TA-TATA
То есть интерфейсами?
Владислав
в гугл
Владислав
IDisposable, IList, IEnumerable и тд
RA-TA-TATA
Слушай, если тут такой разговор зашел) можешь разъяснить про делегаты? Прочитал несколько статей, очень туго зашли
RA-TA-TATA
Буду благодарен
Владислав
переменная типа функции
Владислав
так проще?)
RA-TA-TATA
Это та понятно, зачем они нужны?
RA-TA-TATA
Их применение?
Владислав
чтобы работать с функциями как со значениями
Владислав
и для обработчиков событий
Владислав
короче для того
Владислав
на что онанируют джаисты
Владислав
джависты*
Владислав
ты создаешь тип делегата
Владислав
говоришь что принимает и что возвращает
Владислав
частный пример делегата - EventHandler, Action, Func
Владислав
очень полезно
Владислав
возьмем Action
RA-TA-TATA
Ну EventHandler встроен в действия WPF
RA-TA-TATA
вроде как
Владислав
ща обьясню зачем
Владислав
action - delegate void Action();
Владислав
то есть фуекнция, которая ничего не принимает и ничего не передает
Владислав
теперь ты можешь сделать так
Владислав
void Foo(){//do some stuff} void Main(){ Action a = Foo; a(); }
Владислав
void Main(){ Action a = ()=>{/*do some stuff*/}; a(); }
Владислав
можно лямбдой