主要内容

このペ,ジの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

ハンドル互換クラスの定義方法

ハンドル互換とは

クラスは以下の場合にハンドル互換です。

  • ハンドルクラスである

  • 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

関連するトピック