MATLAB 面向对象编程(四)类的访问权限 private public protected hidden dependent等

无需关注,原文查看
在类的属性中,有一些是属于中间变量,外部不需要知道这些数据的值,因此需要对访问的权限进行控制,避免一个类中的行为干涉到其他类,这样的方法也叫“封装”。
一般来说,权限分为三种,public(默认),private,和protected,public说明该属性全部可以直接访问,private说明该属性只能被该类中的方法访问,子类以及外界无法访问,protected说明该类方法和子类的类方法能够访问。

public属性

只要没有特别说明,都是公有属性,这时任何方式都可以访问。

private属性

% Point.m
classdef Point < handle
  properties (Access = private) % 设置 x 为私有
    x = 0
  end
  properties (Access = {?Point2} )  % 设置为仅 Point2类可访问
      y = 0
  end
  properties (Hidden,Dependent)  % s设置为隐藏
      r
  end
  methods
    function obj = Point(x,y)  % 可以使用nargin得到复杂初始化
        obj.x  = x;
        obj.y = y ;
    end
 function r = get.r(obj)  % get方法获取r的信息
        r = sqrt(obj.x^2+obj.y^2);
    end
    function set.x(obj,var)  % 用set 方法可以限制随意赋值
    if var >= 0
        obj.x = var;
    else
        error('x应为正数');
    end
    end
  end
  end 

在这里插入图片描述

function disp(obj)
disp(['三维坐标为(' num2str(obj.x) ',' num2str(obj.y) ',' num2str(obj.z) ')']);
end

出问题的在Point2中的disp方法,因为无法访问私有属性obj.x,但是不是说这个属性没有被继承,它还是存在于Point2中。

protected属性

classdef Point < handle
  properties (Access = protected)
    x = 0
  end
  properties (Access = {?Point2} )
      y = 0
  end
  properties (Hidden,Dependent)
      r
  end
  methods
    normalize(obj);
    function obj = Point(x,y)  % 可以使用nargin得到复杂初始化
        obj.x  = x;
        obj.y = y ;
    end
    function disp(obj)  % 自定义显示方法
       disp( ['obj.disp was called.'])
    end
    function r = get.r(obj)  % get方法获取r的信息
        r = sqrt(obj.x^2+obj.y^2);
    end
    function set.x(obj,var)  % 用set 方法可以限制随意赋值
    if var >= 0
        obj.x = var;
    else
        error('x应为正数');
    end
    end
  end
  end 

在这里插入图片描述
此时disp方法不会出错,因为子类能够访问protected属性
在这里插入图片描述
但是在类的外部是无法访问到x的。

Hidden和 Dpendent属性

Hidden表示隐藏属性,不影响访问,只是在disp显示的时候默认不会显示出来,这个用于隐藏不重要的信息,不希望显示出来。Dpendent属性不会分配内存,只会在需要它的时候才会计算出来,需要和get方法一起用。以上面的 r 为例,r是二维点到原点的距离,不用赋初始值,在访问它的时候才会计算出来。 set和get方法以后再讲。

    function r = get.r(obj)  % get方法获取r的信息
        r = sqrt(obj.x^2+obj.y^2);
    end

在这里插入图片描述
上面我们可以看到 x和y都不是公有属性所以不会被显示,但是r并没有声明成私有或保护,也不会被显示,因为在类定义中其被声明成了 Hidden,不会被显示到外界,但是依然可以访问。

更细致的权限控制

  1. 只允许指定类可以访问,对其他类和外界为私有
properties (Access = {?Point2} )
  1. 只允许访问不允许修改
properties (SetAccess = private )
  1. 只允许修改不允许访问
properties (GetAccess = private )

上面只是将 Get和Set权限分开了,也可以设置成private和protected以及指定类访问。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肆拾伍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值