@PlaBetaVer

Правильно ли я понял для чего нужны UpCast и DownCast?

Сначала я ничего не понял для чего это нужно, если наследуемый класс и так имеет то, что есть в базовом классе, зачем все эти апкасты.
Потом прочитал про DownCast, приходит понимание того, что не понятно для чего это нужно, если наследник все равно не может использовать поля базового класса.
Единственное, что я понял, так это получение ссылки на объект, вот.
Потом я решил сделать себе удобнее объяснение (Ведь учителя такие умные, значит и объясняют на заумном, нет, чтобы объяснить понятным языком) использовать типы double и int:
Я думаю, что double находиться выше int, так как может использовать интовые значения, но еще и с плавающей точкой, значит, мы можем апкастнуть int в double, но т.к. int находиться ниже double, то мы должны применить downcast, чтобы привести значение с точкой в целое число (только вот int не принимает значения с точкой) (Пока пишу это сообщение я снова не понял зачем нам апкасты и довнкасты)
Так, а теперь я понял, что если мы downcast'им или upcast'им, то мы получаем ссылку на объект, а не на поля классов, ведь так?
Если все эти научные, дофига умные фразы и функции придуманы только для получения ссылки на объекты классов, а не и полей, то я правильно понял или я пошел в какие-то дебри и ничего не понял?
  • Вопрос задан
  • 3977 просмотров
Решения вопроса 1
ayazer
@ayazer
Sr. Software Engineer
наследник может уметь делать что-то еще. Т.е. даункасты - когда нужно добатся до методов которые не описаны в контракте (те наследник умеет делать что-то, что не умеет делать родитель). Апкасты - когда нам наоборот нужно абстрагироватся от ненужных деталей

Например:
public interface IClass {
  void DoSomething();
}

public class Class1: IClass {
  public void DoSomething() { ... }
}

public class Class2: Class1{
  public void DoSomethingFaster() { ... }
}


в этом примере оба класса могут делать полезную работу, но Class2 может сделать ее быстрее (но это не покрывает все случаи, потому просто использовать Class2 вместо Class1 не выйдет).

и дальше у нас может быть что-то такое:

...

public void InvokeWorker(IClass worker){

  if (worker is Class2 class2Worker){
    class2Worker.DoSomethingFaster()
  }
  else {
     worker.DoSomething();
  }
}


не то чтоб это было хорошим дизайном, но иногда бывает. в этом случае мы всегда сделаем работу хоть как-то, но в определенных случаях - мы можем сделать даункаст чтоб получить доступ к методам наследника (и сделать работу быстрее)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы