会社の元のシステムのコードでは、差別的なオブジェクトのクラス名属性を区別する多くのコードが個別に処理されているのを見ました。そして、それは同様の問題に対処する標準的な方法のようです。しかし、いくつかの問題があるかもしれません。
まず第一に、私たちは、多型がオブジェクト指向の3つの主要な特徴の1つであることを知っています。いわゆる多型は、さまざまなコンクリートタイプの場合、コンクリートタイプの実装の詳細に関連することなく、同じ抽象インターフェイスを介してそれらにアクセスできることです。通知を発行するのと同じように:明日9時にすべての従業員がピープルズスクエアに集まります。これは発行者に通知する人の責任ではなく、特定の人の責任であるため、どの時刻とどのルートを取るかについて、別の場所に住んでいる各人に特に通知する必要はありません。したがって、クラス名を個別に処理する必要があると判断するために書き込むとき、最初の考える方法は、親クラスにインターフェイスを追加し、サブクラスオーバーライドを介してそれを完了することです。次のように、図のサイズを変更します。
i:= 0からグラフィックリストへ。count -1 do
始める
グラフィック:=グラフィックリスト[i];
if 图形.ClassName = '长方形' then
始める
长方形(图形).长:= 长方形(图形).长* 2;
长方形(图形).宽:= 长方形(图形).宽* 2;
終わり
それ以外の場合は、graph.classname = 'circle'の場合
始める
Circle(グラフィック)。
終わり
終わり;
「Changesize」メソッドを親クラス「グラフィックス」に追加できます。コードは次のとおりです。
Graphics = class
...
手順の変更(レート:整数);
終わり;
rectangle = class
...
手順の変更(レート:整数);
終わり;
Circle = class
...
手順の変更(レート:整数);
終わり;
特定のグラフィックスクラスにサイズの変更を実装するコード:
手順Rectangle.Changesize(Rate:Integer);
始める
long:= long* rate;
幅:= width*レート;
終わり;
手順circular.changesize(rate:integer);
始める
半径:= radius*レート;
終わり;
この方法で変更した後、上記のコードは次のように呼び出すことができます。
i:= 0からグラフィックリストへ。count -1 do
始める
グラフィック:=グラフィックリスト[i];
Graphics.Changesize(2);
終わり;
これにより、コードがより明確になります。
もちろん、多くの場合、ClassNameを判断するときに上記のソリューションを使用することはできません。たとえば、フォームのコトロールを反復し、異なるコントロールで初期試験を実施します。初期化方法をtcontrolに追加することは不可能であり、特定のサブクラスタイプを区別するためにのみ使用できます。その後、この時点で、クラス名を直接比較する代わりに、IS演算子を使用することをお勧めします。
is的用法,语句aObject is TForm 在不同的aObject的类型情况下结果如下:
aObject是TObject,结果为假;
aobjectはtformであり、結果は真です。
aobjectはtform1であり、結果は真です。
aobjectはteditであり、結果は偽です。
aObject是nil,结果为假;
上記の例から、使用することの利点があります。将来的には、TCooleditを変更するためにTCooledITを使用することができます。これは、TCooleditがTEDITである場合、サブクラスの名前に変更する必要があるためです。
第二に、Judedオブジェクトが空の場合は、クラス名を使用して最初にオブジェクトが割り当てられているかどうかを判断します。そうしないと、メモリアクセスエラーが発生します。判断の代表者は、(AOBJECT)およびAOBJECT.CLASSNAME = 'TCLASS1'の場合に記述する必要があります。
クラス名が判断として使用されない最後の理由は、クラスの比較をコンピレーション期間中にチェックできないため、ClassNameを使用することです。 logical errors. This An error will only be discovered when the statement is running during the run.
acontrol.classname = 'teidt'の場合、//このコードは、編集が最初にテストされていないことに気付いた場合にのみチェックされます。
if aControl is TEidt then //无法编译通过;
Based on the above, when it is necessary to determine the specific type of an object, first of all, we should consider avoiding such special processing statements through polymorphic processing. If it is really unavoidable, we should use the is operator to judge, rather classNameより。
非常に特別なケースでは、TeditとTcooleditを個別に処理する必要がある場合、希望する結果が得られません。これは、タイプ検出のための文字列の比較よりも優れています。
acooleditはtedit // true;
acooledit.clasStype = tedit // false;
aCoolEdit.ClassType = TCoolEdit //True;