Supponiamo di avere una classe uicontrolWrapper
, che è un wrapper per un uicontrol
(ma non la sottoclasse). Il materiale uicontrol
è conservato in una proprietà privata per uicontrolWrapper
. Fondamentalmente, voglio essere in grado di fare set/get
contro il wrapper, e le chiamate si alimentano in uicontrol
.Esiste un nome per questo motivo di progettazione (che si avvolge dinamicamente attorno ad un'altra classe)?
avrei potuto fare questo:
classdef uicontrolWrapper < handle
properties (Access = private)
uic
end
properties (Dependent)
Style
String
Value
...
end
methods
function set.Style(obj, val)
obj.uic.Style = val;
end
function val = get.Style(obj)
val = obj.uic.Style;
end
...
end
ma hardcoding come questo è, ovviamente, piuttosto brutto.
Oppure, potrei fare dynamically generate properties dependent on what I'm trying to wrap:
classdef uicontrolWrapper < dynamicprops
properties (Access = private)
uic
end
methods
function obj = uicontrolWrapper(hObj)
obj.uic = hObj;
cellfun(@(prop) obj.createProperty(prop, fields(get(hObj));
end
function createProperty(obj, prop)
p = addprop(obj, prop);
p.Dependent = true;
p.SetMethod = @setUicontrolProp;
p.GetMethod = @getUicontrolProp;
function setUicontrolProp(obj, val)
obj.uic.(prop) = value;
end
function val = getUicontrolProp(obj)
val = obj.uic.(prop);
end
end
end
end
Il punto è quello di evitare di violare il Law of Demeter da non "raggiungendo in" la proprietà che stiamo cercando di modificare.
Non so se questo è un motivo di progettazione, ma ho usato questo tipo di cose per avvolgere oggetti di diverso tipo quando la sottoclasse è per qualche motivo o un altro inappropriato. (Ad esempio, la classe matlab.ui.control.UIControl
è Sealed
e non può essere sottoclasse.) Ha un nome effettivo e un uso tipico previsto?
Tipo di mi ricorda il [Decoratore] (http://www.oodesign.com/decorator-pattern.html). In pratica ti dà la possibilità di aggiungere funzionalità alla classe estesa. Non sono sicuro se questo è il tuo caso però. Mai visto prima MATLAB, quindi è un po 'di confusione da leggere per me. – Bono
perché il downvote? Sarei felice di modificare per rendere questa domanda migliore. –
Non ero io. Ho svalutato il downvote, perché mi sembra una buona domanda chiara. – Bono