2015-03-02 130 views
1

我想修改一個子類的不可變/受保護的屬性,使用超類方法或外部實用程序函數(我試圖在當然是子類的構造函數)。在超類方法中修改子類的不可變/受保護的變量

例(我想要做什麼):

classdef Sup 
    methods 
    function self = setProperties(self, varargin) 
     % This method sets the properties of the object 
     % the input arguments come in the form 'propname1', val1, 'propname2', val2, ... 
     ... 
    end % setProperties 
    end % methods 
end % classdef Sup 


classdef sub < Sup 
    properties (SetAccess = immutable) 
    prop1 
    prop2 
    prop3 
    end % properties 
    methods 
    function self = sub(varargin) 
     % constructor 
     self = setProperties(self, varargin) 
    end % sub 
    end % methods 
end % classdef sub 


>> SomeObj = sub('prop1', 1, 'prop2', 10, 'prop3', 100); 

此代碼不能正常工作,我得到錯誤信息「你不能設置只讀屬性‘爲prop1’子」。

我可以設置子屬性來保護,但我不希望它們公開。我同樣認爲setProperties是一個外部工具函數(沒有在超類中定義),但是再次,我不能在sub的構造函數中使用setProperties。

希望你對此有所幫助。 謝謝

Avihay

回答

0

如果你願意,你可以設置的sub?SupSetAccess屬性 - 換句話說說,他們只能通過類Sup進行設置。

這似乎是做你直接要求 - 但是,我應該說這似乎是一個不尋常的模式正在實施。我想知道更好的建議可能是檢查爲什麼你需要這樣做,或者重新設計你的班級關係。

編輯:

如果你需要的是在構造函數方便地設置屬性的一般方法,你可以嘗試從繼承類的內置hgsetget類。例如,

classdef sub < hgsetget 
    properties (SetAccess = immutable) 
    prop1 
    prop2 
    prop3 
    end % properties 
    methods 
    function self = sub(varargin) 
     set(self,varargin{:}) 
    end 
    end 
end 

hgsetget爲您提供了內置可與語法set(obj, 'myprop', myval, 'myprop2', myval2)和類似的使用(如MATLAB句柄圖形對象,因此在hghgsetget)方法set(和get)。

這可能對您更方便。請注意,hgsetget本身就是handle的一個子類,所以您必須對您的課程感到滿意,因爲它們是handle對象。但是,如果你正在考慮immutable屬性,那麼你可能已經確定了。

編輯2:

另一種方法,這將與值對象的工作,可能是以下幾點:

classdef sub 
    properties (SetAccess = immutable) 
    prop1 
    prop2 
    prop3 
    end % properties 
    methods 
    function self = sub(varargin) 
     % constructor 
     props = varargin(1:2:end-1); 
     vals = varargin(2:2:end); 
     for i = 1:numel(props) 
      self.(props{i}) = vals{i}; 
     end 
    end 
    end 
end 

或者,你可以利用inputParser構造函數中,給你一個更靈活的語法範圍。

+0

非常感謝您的回答。在'SetAccess'中使用'?Sup'確實有效,但我不太喜歡它,因爲你的代碼中可能有許多'properties ... end'塊。我真正想要做的是定義一個通用的超類,用於我生成的許多子類。我希望'setProperties'對所有這些子類都可用,但是我想擁有一些'protected'屬性。 – Avihay 2015-03-02 11:20:52

+0

看到我的編輯另一個建議。 – 2015-03-02 11:59:18

+0

再次感謝Sam,這種做法確實很有趣。我實際上並不打算使用'handle'對象,因爲我正在使用的大多數代碼已經使用了'value'對象(不幸的是)...你知道有什麼方法可以爲'value'對象?順便說一下,如果您對可能解決我的問題的其他設計有任何建議,那也會很好。 – Avihay 2015-03-02 12:36:42

相關問題