このペ,ジの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
ハンドル互換クラスの定義方法
ハンドル互換とは
クラスは以下の場合にハンドル互換です。
ハンドルクラスである
HandleCompatible
属性が真正的
に設定されている
HandleCompatible
クラス属性は,スーパークラスのセットを指定するときにハンドルクラスで結合できるクラスを識別します。
ハンドル互換性は,抽象ス,パ,クラスを定義する場合に高い柔軟性を実現します。たとえば,ハンドルと値の両方のサブクラスをサポートするスーパークラスを使用する場合は,ハンドル互換性により,クラスのハンドルバージョンと非ハンドルバージョンの両方を定義する必要がなくなります。
ハンドル互換クラス
实用程序
クラスはハンドルサブクラスおよび値サブクラスの両方にとって有用です。この例では,实用程序
クラスがプロパティ値をそれぞれのクラス定義で定義される既定値にリセットするメソッドを定義します。
classdef(HandleCompatible)实用工具方法函数obj = resetDefaults(obj) mc =元类(obj);mp = mc.PropertyList;为k = 1:长度(mp)如果mp (k)。HasDefault && ~strcmp(mp(k)。SetAccess,“私人”) obj.(mp(k). name) = mp(k). defaultvalue;结束结束结束结束结束
实用程序
クラスはハンドル互換です。したがって,このクラスを使用して,ハンドルクラスか値クラスのいずれかとなるクラスを導き出すことができます。メタデ,タクラスの使用方法の詳細は,クラス▪▪ントロスペクションおよびメタデ▪▪タを参照してください。
変更されたオブジェクトを返す
实用程序
クラスによって定義されるresetDefaults
メソッドは,オブジェクトを変更して返します。resetDefaults
を値オブジェクトと共に呼び出した場合,メソッドは変更されたオブジェクトを返さなければなりません。ハンドル互換スーパークラスにハンドルオブジェクトと値オブジェクトの両方と機能するメソッドを実装することが重要です。ハンドルオブジェクトと値オブジェクトの変更の詳細は,オブジェクトの変更を参照してください。
实用程序
クラスをサブクラス化する値クラスの動作を考えてみましょう。PropertyDefaults
クラスは3のプロパティを定義し,ます。
classdefPropertyDefaults <实用程序属性P1 = datestr(rem(now,1))%当前时间p2 =“红色”字符向量P3 = /2%除法运算结果结束结束
PropertyDefaults
オブジェクトを作成します。MATLAB®は,クラスが最初に読み込まれるときに既定のプロパティ値として代入される式を評価します。MATLABは、現在の MATLAB セッションでこのクラスのインスタンスが作成されるときに、必ずこれらの同じ既定値を使用します。
pd = PropertyDefaults
pd = propertydefault属性:p1: ' 4:42 PM' p2: 'red' p3: 1.5708
既定値と異なる新しい値を割り当てます。
pd。P1 = datestr(rem(now,1));pd。p2 =“绿色”;pd。P3 = pi/4;
すべてのpd
オブジェクトプロパティ値にクラスによって本来定義された既定値とは異なる値が含まれるようになりました。
pd
pd = property默认属性::p1: ' 4:45 PM' p2: 'green' p3: 0.7854
实用程序
クラスから継承されるresetDefaults
メソッドを呼び出します。PropertyDefaults
クラスはハンドルクラスではないため,変更されたオブジェクトを返します。
pd = pd. resetdefaults
pd = propertydefault属性:p1: ' 4:54 PM' p2: 'red' p3: 1.5708
PropertyDefaults
クラスがハンドルクラスであった場合,resetDefaults
メソッドで返されるオブジェクトを保存する必要はありません。实用程序
のようなハンドル互換クラスを設計するには,すべてのメソッドが両方の種類のクラスで機能するよう確認します。
ハンドル互換クラスのサブクラス化
ハンドル互換性規則で説明した規則に従って,ハンドルスーパークラスをハンドル互換スーパークラスと結合する場合,結果はハンドルサブクラスとなり,ハンドル互換となります。
ただし,ハンドル互換クラスをサブクラス化しても,必ずしもサブクラスがハンドル互換にはなりません。次の2の場合を考えてみましょう。これらは2の考えられる結果を示します。
非ハンドルユ,ティリティクラスをハンドルクラスと結合する
ハンドルクラスおよびハンドル互換クラスで説明したハンドル互換实用程序
クラスをサブクラス化するクラスを定義するとします。HPropertyDefaults
クラスには,次の特性があります。
ハンドルクラスです(
处理
から派生します)。このクラスのスーパークラスはすべてハンドル互換です(ハンドルクラスは定義によりハンドル互換です)。
classdefHPropertyDefaults < handle & Utility属性GraphPrim = line Width = 1.5 Color =“黑”结束结束
HPropertyDefaults
クラスはハンドル互換です。
hpd = HPropertyDefaults;MC =元类(hpd);mc.HandleCompatible
Ans = 1
ハンドル互換クラスの非ハンドルサブクラス
ハンドル互換でない値クラスとハンドル互換クラスの両方をサブクラス化する場合,サブクラスは非ハンドル互換の値クラスになります。ValueSub
クラスは,以下のようになります。
値クラスです(
处理
から派生しません)。この値クラスのスパクラスの1はハンドル互換です(
实用程序
クラス)。
classdefValueSub < MException & Utility方法函数obj = ValueSub(str1,str2) obj = obj@MException(str1,str2);结束结束结束
ValueSub
クラスは,ハンドル互換でない値クラスです。これは,MException
クラスがHandleCompatible
属性を真正的
として定義しないためです。
hv = ValueSub(MATLAB: narginchk: notEnoughInputs,...“输入参数不够。”);MC =元类(hv);mc.HandleCompatible
Ans = 0