Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
899
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
952
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
942
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1727
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6088
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4400
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Каковы некоторые примеры 'good use' динамического кастинга?
Мы часто слышим / читаем, что следует избегать динамического кастинга. Мне было интересно, каков будет 'good use' примеров этого, по вашему мнению?
Редактировать:
Да, я знаю об этой другой теме : действительно, читая один из первых ответов там, я задал свой вопрос!
Этот недавний поток дает пример того, где он может пригодиться. Существует базовый класс Shape и производные от него классы Circle и Rectangle. При проверке на равенство очевидно, что круг не может быть равен прямоугольнику, и было бы катастрофой пытаться сравнить их. При итерации по коллекции указателей на фигуры dynamic_cast выполняет двойную функцию, сообщая вам, сопоставимы ли фигуры,и давая вам соответствующие объекты для сравнения.
Вектор итератор не уникальным
Вот что я часто делаю, это не очень красиво, но это просто и полезно.
Я часто работаю с контейнерами шаблонов, которые реализуют интерфейс, представьте себе что-то вроде
template<class T>
class MyVector : public ContainerInterface
...
Где ContainerInterface имеет основные полезные вещи, но это все. Если мне нужен конкретный алгоритм на векторах целых чисел без раскрытия моей реализации шаблона, полезно принять объекты интерфейса и dynamic_cast его вниз до MyVector в реализации. Пример:
// function prototype (public API, in the header file)
void ProcessVector( ContainerInterface& vecIfce );
// function implementation (private, in the .cpp file)
void ProcessVector( ContainerInterface& vecIfce)
{
MyVector<int>& vecInt = dynamic_cast<MyVector<int> >(vecIfce);
// the cast throws bad_cast in case of error but you could use a
// more complex method to choose which low-level implementation
// to use, basically rolling by hand your own polymorphism.
// Process a vector of integers
...
}
Я мог бы добавить метод Process() к ContainerInterface, который был бы полиморфно разрешен, это был бы более приятный метод OOP, но иногда я предпочитаю делать это таким образом. Когда у вас есть простые контейнеры, много алгоритмов, и вы хотите сохранить свою реализацию скрытой, dynamic_cast предлагает простое и уродливое решение.
Вы также можете посмотреть на методы двойной отправки.
HTH
Мой текущий игрушечный проект использует dynamic_cast дважды: один раз, чтобы обойти отсутствие множественной отправки в C++ (это система в стиле посетителя, которая может использовать множественную отправку вместо dynamic_casts), и один раз, чтобы сделать особый случай для конкретного подтипа.
На мой взгляд, и то и другое вполне приемлемо, хотя первое, по крайней мере, проистекает из языкового дефицита. Я думаю, что это может быть обычной ситуацией, на самом деле; большинство dynamic_casts (и очень много "design patterns" в целом) являются обходными путями для конкретных языковых недостатков, а не тем, к чему стремятся.
Он может быть использован для обеспечения безопасности типа во время выполнения при предоставлении дескрипторов объектам через интерфейс C. Пусть все открытые классы наследуются от общего базового класса. Принимая дескриптор функции, сначала приведите его к базовому классу, а затем динамическое приведение к ожидаемому классу. Если они прошли в несенсорном дескрипторе, вы получите исключение, когда время выполнения не может найти rtti. Если они передали допустимый дескриптор неправильного типа, вы получаете указатель NULL и можете создать свое собственное исключение. Если они прошли в правильном указателе, вы хорошо идете. Это не защита от дураков,но, безусловно, лучше ловить ошибочные вызовы библиотек, чем прямое переинтерпретирование из дескриптора и ждать, пока некоторые данные не будут таинственно повреждены, когда вы передадите неправильный дескриптор.
Ну это было бы действительно хорошо с методами расширения в C#.
Например, предположим, что у меня есть список объектов, и я хочу получить от них Список всех идентификаторов. Я могу пройти через них все и вытащить их, но я хотел бы сегментировать этот код для повторного использования.
так что что-то вроде
List<myObject> myObjectList = getMyObjects();
List<string> ids = myObjectList.PropertyList("id");
было бы здорово, если бы не метод расширения, вы не будете знать тип, который входит.
Так
public static List<string> PropertyList(this object objList, string propName) {
var genList = (objList.GetType())objList;
}
это было бы потрясающе.