這是我的想法。我將創建一個名爲Developer
的類,該類將包含一個Developable
對象作爲屬性。稱爲Developable
的接口將具有3個抽象方法,getProperty
,setProperty
和meval
。我將限制訪問這些方法Developable
和Developer
。這裏有以下一些示例代碼:
的classdef
爲Developable
classdef (Abstract) Developable < handle
methods (Abstract, Access = {?Developable, ?Developer})
propVal = getProperty(This, propName)
This = setProperty(This, propName, propVal)
varargout = meval(This, methodName, varargin)
end
end
和Developer
classdef Developer < handle
properties
[email protected]
end
methods
function This = Developer(DevObj)
if isa(DevObj, 'Developable')
This.DevObj = DevObj;
warnId = '''Developer:debugUseOnly''';
warnMessage = ['''The Developer class should only be used ' ...
'temporarily to gain access to private and ' ...
'protected class members. Do not use in any ' ...
'permanent manner. Instead contact the owner ' ...
'of the class you wish to modify, and work out a ' ...
'solution.'''];
warnStr = ['warning(' warnId ',' warnMessage ')'];
evalin('caller', warnStr)
else
errorId = 'Developer:nonDevelopableObject';
errorMsg = 'DevObj must be a Developable Object';
error(errorId, errorMsg)
end
end
function propVal = getProperty(This, propName)
propVal = This.DevObj.getProperty(propName);
end
function setProperty(This, propName, propVal)
This.DevObj.setProperty(propName, propVal);
end
function varargout = meval(This, methodName, varargin)
if nargout > 0
out = cell(1, nargout);
[out{:}] = This.DevObj.meval(methodName, varargin{:});
varargout = out;
else
This.DevObj.meval(methodName, varargin{:});
end
end
end
end
這似乎爲我工作,但也有一些問題吧:
有沒有人有更好的方法來解決我的問題,或解決我上面列出的一些問題?
下面是一個例子Developable
類:
classdef DevTest < Developable
properties (Access = private)
privateProp = 'This property is private';
end
methods (Access = private)
function privateMethod(This)
disp('You''ve gained access to a private method!')
end
end
methods (Access = {?Developable, ?Developer})
function propVal = getProperty(This, propName)
propVal = This.(propName);
end
function This = setProperty(This, propName, propVal)
This.(propName) = propVal;
end
function varargout = meval(This, methodName, varargin)
if nargout > 0
varargout = cell(nargout, 1);
[varargout{:}] = This.(methodName)(varargin{:});
else
This.(methodName)(varargin{:});
end
end
end
end
我很努力地看到這一點,在這裏......如果您打算編寫代碼來打破MATLAB的OO範例,那麼爲什麼還要麻煩編寫OO代碼?聽起來像是給我帶來麻煩......也許如果你對最終目標提供了一個不太抽象的描述,那麼可能會更容易幫助你想出一個有形的設計。 – wakjah 2013-05-11 09:33:22