【发布时间】:2015-07-17 20:17:08
【问题描述】:
假设我有一个称为矩形的超类:
classdef Rectangle
properties
width
height
x0 = 0
y0 = 0
angle = 0
end
methods
function obj = Rectangle(x0, y0, width, height, angle)
obj.x0 = x0;
obj.y0 = y0;
obj.width = width;
obj.height = height;
obj.angle = angle;
end
end
end
我有一个名为 Map 的子类,我希望其中的所有属性在设置后都是只读的:
classdef Map < Rectangle
properties (SetAccess=private)
filename
end
methods
function obj = Map(filename)
% Get info from map using a function that uses geotiffread
[x0, y0, width, height] = GetInfoFromMap(filename);
obj = obj@Rectangle(x0, y0, width, height, 0);
obj.filename = filename;
end
end
end
如何在 Map 中将 Rectangle 的继承属性设置为只读?我希望任何独立(非地图)矩形对象的属性保持可变。
另外,我如何确保其中一些属性只能采用某些值?即,对于我的目的,矩形可以有任何角度,但我希望地图的角度始终为 0。但如果我尝试为 Map 创建 set.angle 方法以确保角度只能为 0,我得到一个错误告诉我“无法为类 'BackgroundMap' 中的属性 'angle' 指定设置函数,因为该属性不是由该类定义的。”
【问题讨论】:
-
你会如何在其他 oop 语言中做类似的事情?您会使用更严格的限定符(例如
private而不是public/protected)覆盖超类属性吗?关于 MATLAB - 一个常见的(虽然不是很 oop;我不喜欢)方法是打破继承关系,并使Map成为一个自己的类,该类具有指向某个Rectangle的属性和从handle扩展Rectangle.. 还有一个问题-假设您继承了Map中的属性,它们是否会被修复,或者如果强制转换为超类可能会改变? -
我不知道,MATLAB 是我第一次接触 OOP,除了对 python 的非常简短的介绍,从未涉足继承。我知道 MATLAB 不是一种理想的 OOP 语言,但它是我们在工作中需要使用的。老实说,我只是假设您可以对继承的属性设置约束,但也许不是这样。感谢您提供有关打破继承的提示。
标签: matlab oop inheritance superclass