В Кодексе оригинальной системы компании я увидел много кодов, которые различают атрибуты классной имени различных объектов, обрабатываются отдельно. И это кажется стандартным способом решения аналогичных проблем. Но могут быть некоторые проблемы.
Прежде всего, мы знаем, что полиморфизм является одной из трех основных особенностей объектно-ориентированных. Так называемый полиморфизм заключается в том, что для различных конкретных типов мы можем получить к ним доступ через один и тот же абстрактный интерфейс без необходимости относиться к деталям реализации конкретных типов. Так же, как выпуск уведомления: все сотрудники собираются на People's Square в 9 часов. Нет необходимости специально уведомлять каждого человека, живущего в другом месте, о том, какое время выбрать и какой путь выбрать, потому что это обязанность конкретного человека, а не ответственность за человека, который уведомит эмитента. Следовательно, при написании, чтобы определить, что имя класса необходимо обрабатывать отдельно, первый способ придумать - добавить интерфейс к родительскому классу и завершить его через переопределение подкласса. Измените размер фигуры следующим образом:
для i: = 0 к графическому списку.count - 1 do
Начинать
Графика: = графический список [i];
Если graphic.classname = 'rectangle', тогда
Начинать
Прямоугольник (графический) .length: = прямоугольник (графический) .length* 2;
Прямоугольник (графический) .width: = прямоугольник (графический) .width* 2;
конец
иначе, если graph.classname = 'circle', тогда
Начинать
Круг (график).
конец
конец;
Вы можете добавить метод «Изменения» в родительский класс «Графика», код заключается в следующем
Graphics = Class
...
Процедура изменяется (скорость: целое число);
конец;
прямоугольник = класс
...
процедура изменяется (скорость: целое число);
конец;
Круг = класс
...
процедура изменяется (скорость: целое число);
конец;
Код для реализации изменений размера в конкретных графических классах:
Процедура прямоугольник. Cangesize (скорость: целое число);
Начинать
длинный: = длинная* скорость;
Ширина: = ширина* скорость;
конец;
процедура Circular.Changesize (скорость: целое число);
Начинать
Радиус: = Радиус* скорость;
конец;
После изменения такого пути приведенный выше код можно назвать таким:
для i: = 0 к графическому списку.count - 1 do
Начинать
Графика: = графический список [i];
Graphics.changesize (2);
конец;
Это делает код более ясным.
Конечно, во многих случаях вышеуказанное решение не может использоваться при оценке имени класса. Например, итерация над Cotrols Form и проведет первоначальные испытания на разных элементах управления. Нам невозможно добавить методы инициализации в TControl, мы можем использовать только для различения конкретных типов подкласса. Затем в это время я рекомендую использовать оператор IS вместо прямого сравнения ClassName.
Использование IS, утверждение AOBject является TFORM приводит к различным типам aObject:
aObject является Tobject, и результат неверно;
AObject является Tform, и результат верен;
aObject является tform1, и результат верен;
aObject - это плюсы, и результат неверно;
aObject - это NIL, и результат неверно;
Из приведенного выше примера мы видим преимущество использования. В будущем TCOOLEDIT может использоваться для украшения интерфейса, поэтому этот код не должен быть изменен, потому что TCOOLEDIT - это TEDIT;
Во -вторых, если оцененный объект может быть пустым, используйте имя класса, чтобы определить, сначала ли объект назначен, в противном случае возникнет ошибка доступа к памяти. Представитель суда должен быть написан как: если назначено (AOBject) и AOBject.ClassName = 'tclass1';
Последняя причина, по которой ClassName не используется в качестве суждения, заключается в том, что ClassNate используется только для описания свойств класса. Логические ошибки.
Если acontrol.classname = 'teidt', то // этот код будет проверять только в том случае, если вы заметите, что редактирование изначально не протестировано;
Если Acontrol IS Teidt, то // не может быть скомпилирован и прошел;
Основываясь на вышеизложенном, когда необходимо определить конкретный тип объекта, мы должны рассмотреть возможность избежать таких специальных операторов обработки посредством полиморфной обработки. чем имя класса.
В особом случае не может быть получено желаемый результат, например, если TEDIT и TCOOLEDIT должны быть обработаны отдельно. который будет лучше, чем ничего.
Acooledit - это TEDIT // TRUE;
acooledit.classtype = tedit // false;
acooledit.classtype = tcooledit // true;