主要内容

类成员的访问

基本知识

在这一节中给出的材料基于这些概念的理解:

术语和概念

可能值对类成员的访问

申请访问控制列表

访问控制列表允许您控制访问特定的类属性,方法,事件。访问控制列表指定一个类列表,您授予访问这些类成员。

这种技术提供了更大的灵活性和控制系统的设计的课程。例如,使用访问控制列表来定义单独的类,但不允许访问类成员从类外部系统。

指定对类成员的访问

指定的类允许访问一个特定的类成员在成员的访问属性声明。例如:

方法(访问= {?ClassName1,吗?ClassName2,……})

使用的类meta.class对象引用类的访问列表。指定一个以上的类,使用的单元阵列meta.class对象。使用包名指类的包。

请注意

指定meta.class明确(创建对象吗?操作符),而不是作为函数返回的值或其他MATLAB表达式。

如何MATLAB解释属性值

  • 授予访问列表的类只限制访问:

    • 定义类

    • 列表中的类

    • 列表中的类的子类

  • 包括定义类的访问列表给所有子类定义类的访问。

  • MATLAB解决引用类的访问列表中只有当类被加载。如果MATLAB不能找到一个类包含在访问列表中,类是有效地移除访问。

  • MATLAB取代未解决的meta.class列表中的条目与空的meta.class对象。

  • 一个空的访问列表(即一个空单元数组)是等价的私人访问。

指定元类对象

生成meta.class只使用对象吗?操作符和类名。值分配给属性不能包含任何其他MATLAB表达式,包括允许函数,返回属性值:

  • meta.class对象

  • 细胞数组meta.class对象

  • 的值公共,受保护的,或私人

显式地指定这些值,如本节中的示例代码所示。

属性的访问列表

这些样本的类属性的行为表明授予读访问(GetAccess一个类。的GrantAccess类提供了GetAccessNeedAccess类的Prop1属性:

classdefGrantAccess属性(GetAccess = ? NeedAccess) Prop1 = 7结束结束

NeedAccess类定义了一个方法,使用的价值GrantAccessProp1价值。的dispObj被定义为一个方法静态方法,然而,它可能是一个普通的方法。

classdefNeedAccess方法(静态)函数dispObj (GrantAccessObj) disp ([“Prop1是:”num2str (GrantAccessObj.Prop1)])结束结束结束

获得Prop1是私人所以MATLAB返回一个错误如果你试图访问属性在类定义之外。例如,从命令行:

一个= GrantAccess;a.Prop1
获得“Prop1”“GrantAccess”类的属性是不允许的。

然而,MATLAB允许访问Prop1NeedAccess类:

NeedAccess.dispObj (a)
Prop1是:7

方法的访问列表

类授予访问方法:

  • 调用该方法使用一个定义类的实例。

  • 定义自己的具有相同名称的方法(如果不是一个子类)。

  • 在子类中重写的方法只有在父类定义的方法包括本身或子类访问列表。

这些示例类节目的行为方法从方法调用其他类访问列表。类AcListSuper给出了AcListNonSub类访问它m1方法:

classdefAcListSuper方法(访问= {? AcListNonSub})函数obj = m1 (obj) disp (m1的方法叫做“)结束结束结束

因为AcListNonSub的访问列表m1,它可以调用的方法m1使用的一个实例AcListSuper:

classdefAcListNonSub方法函数obj = nonSub1 (obj AcListSuper_Obj)%打电话给m1 AcListSuper类AcListSuper_Obj.m1;结束函数obj = m1 (obj)%定义一个名为m1的方法disp ([“m1定义的方法”类(obj)])结束结束结束

创建对象的类:

一个= AcListSuper;b = AcListNonSub;

调用AcListSuperm1方法使用一个AcListNonSub方法:

b.nonSub1(一个);
方法m1调用

调用AcListNonSubm1方法:

b.m1;
m1 AcListNonSub定义的方法

子类没有访问

包括定义类访问列表的方法授予访问所有子类从这个类派生而来。当你来自一个类的方法访问列表,这个列表包括定义类:

  • 子类方法不能调用超类方法。

  • 子类方法可以调用父类方法间接地使用一个类的实例,在访问列表。

  • 子类不能覆盖超类方法。

  • 方法类的父类方法的访问列表,但这不是子类,可以调用超类方法。

例如,AcListSub是一个子类AcListSuper。的AcListSuper类定义了一个访问列表的方法m1。然而,这个列表不包括AcListSuper,所以子类AcListSuper没有访问方法m1:

classdefAcListSub < AcListSuper方法函数obj = sub1 (obj AcListSuper_Obj)%通过父类对象访问m1(* * * * * *不允许)AcListSuper_Obj.m1;结束函数obj = sub2 (obj, AcListNonSub_Obj AcListSuper_obj)%通过对象访问m1在访问列表(允许)AcListNonSub_Obj.nonSub1 (AcListSuper_Obj);结束结束结束

没有直接调用超类的方法

试图调用超类m1方法从sub1方法会导致错误,因为子类的访问列表中m1:

一个= AcListSuper;c = AcListSub;c.sub1(一个);
“m1”类不能访问方法“AcListSuper”。错误AcListSub / sub1 AcListSuper_Obj.m1(4号线);

间接调用超类方法

你可以从一个子类调用父类方法没有访问该方法使用一个对象类的超类方法访问列表。

AcListSubsub2类的方法调用一个方法(AcListNonSub在访问列表)m1。这种方法,nonSub1,获得超类m1方法:

一个= AcListSuper;b = AcListNonSub;c = AcListSub;c.sub2 (b);
方法m1调用

没有重新定义父类的方法

当子类不包括访问列表的方法,这些子类不能定义一个具有相同名称的方法。这种行为是不一样的情况下,该方法访问显式地声明为私人

例如,添加以下方法AcListSub类定义产生一个错误,当你试图实例化类。

方法(访问= {? AcListNonSub})函数obj = m1 (obj) disp (“AcListSub m1方法”)结束结束
c = AcListSub;
类“AcListSub”不允许覆盖的方法“m1”,因为它和它的父类都被授予访问方法的类“AcListSuper”。

通过子类调用父类上市类

AcListNonSub类是在m1方法访问列表。这个类可以定义一个方法调用m1使用一个对象的方法AcListSub类。而AcListSub不是访问列表的方法m1,它的一个子类AcListSuper

例如,添加以下方法AcListNonSub类:

方法函数obj = nonSub2 (obj, AcListSub_Obj) disp (“叫m1通过子类对象:”)AcListSub_Obj.m1;结束结束

调用nonSub2导致执行父类的方法m1方法:

b = AcListNonSub;c = AcListSub;b.nonSub2 (c);
通过子类对象:方法调用m1 m1

这种行为是一致的任何子类对象的行为,可代替其超类的一个对象。

抽象方法访问列表

包含一个方法声明为一个类文摘是一个抽象类。有责任子类实现抽象方法在类定义中使用声明的函数签名。

当一个抽象方法有一个访问列表,只访问列表中的类可以实现的方法。这并不是一个子类的访问列表中不能实现抽象方法,子类本身是抽象的。

相关的话题