Допустим, у меня есть суперкласс называется прямоугольник:MATLAB: Set наследуемые свойства только для чтения
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 = [email protected](x0, y0, width, height, 0);
obj.filename = filename;
end
end
end
Как я могу наследовать свойства Rectangle только для чтения в пределах карты? Я хочу, чтобы свойства любого автономного объекта (non Map) Rectangle оставались изменчивыми.
А также, как я могу гарантировать, что некоторые из этих свойств могут принимать только определенные значения? т.е. для моих целей прямоугольник может иметь любой угол, но я бы ожидал, что карта всегда будет иметь угол 0. Но если я попытаюсь создать метод set.angle для Map, чтобы гарантировать, что угол может быть равен 0, я получаю ошибка, сообщающая мне, что «Невозможно указать функцию set для свойства« angle »в классе« BackgroundMap », потому что это свойство не определено этим классом».
Как бы вы сделали что-то подобное на других языках? Не могли бы вы переопределить свойства суперкласса, используя более ограничительные квалификаторы (например, 'private' вместо' public'/'protected')? Что касается MATLAB - общий подход (хотя и не очень простой, который мне не нравится) заключался бы в том, чтобы разбить отношение наследования и сделать «Map» своим классом, который имеет свойство, которое указывает на определенный «Прямоугольник» и расширьте 'Rectangle' от' handle'. Еще один вопрос - предположим, что вы унаследовали свойства в «Map», будут ли они исправлены или, возможно, сменны, следует ли выполнять надверхность? –
Я не знаю, MATLAB - это мое первое знакомство с ООПом, за исключением очень короткого введения в питоне, который никогда не отваживался до наследования. Я знаю, что MATLAB не является идеальным языком ООП, но это то, что мы должны использовать на работе. Честно говоря, я только предположил, что вы сможете установить ограничения на унаследованные свойства, но, возможно, это не так. Спасибо за намек на нарушение наследства. – EddyTheB