2017-03-09 21 views
5

MATLAB R2016a, bir nesnenin özellik sınıfını kısıtlamak için belgelenmiş bir mekanizma tanıttı (Bunu yapmak için daha eski, farklı, belgelenmemiş bir yol olduğunu da biliyorum, ancak ben değilim bu yöntemi kullanarak). Örneğin: kendi değerleri sınıfının RestrictedClass olmalıdır böyleceMATLAB: sınırlı sınıf özelliklerini keşfedin

classdef MyClass 
    properties 
     myProperty RestrictedClass 
    end 
end 

özelliği myProperty sınırlayacaktır.

Böyle bir sınıf uyguladıysanız, kısıtlı özellik sınıfını programlı olarak bulmak için MATLAB sınıf meta veri arabirimini kullanmanın bir yolu var mı?

ben

m = ?MyClass; 
p = m.PropertyList(1); 

kullanılırsa o zaman metaproperty nesne p sınıfı hakkında bilgi içeren umuyordum hangi kısıtlandı için - ama değil gibi görünüyor.

Programlı olarak keşfetmenin bir yolu var mı? Yöntemin, aslında sınıfın ortaya çıkmasını gerektirmemesi gerekecek - her ikisi de yan etkilere sahip olabileceği için ve ayrıca soyut sınıflarla çalışması gerektiğinden.

PS Ayrıca sınıfın kaynak kodunu ayrıştırmak gibi brüt hiçbir şey içermiyor. Bunu, kaynak kodu pcode kullanarak gizlenmiş bir sınıfla yapmak isteyebileceğimi düşünün.

cevap

0

Nesnenin genel olmayan özelliklerini incelemek için bir nesneyi yapıya dönüştürmenin belgesiz kesiğini kullanabilirsiniz. Verilen örnek sınıfıyla

Validation with properties: 

       Class: [1×1 meta.class] 
        Size: [1×0 meta.ArrayDimension] 
    ValidatorFunctions: {1×0 cell} 

:

:

classdef SOcode 
    properties 
     myProperty1 double 
     myProperty2 struct 
    end 
end 

Aşağıdaki gibi bir şey yapabilirsiniz meta.Property nesneler özelliği için doğrulama bilgileri sahiptir gizli meta.Validation nesne özelliği içerir

SOcodemeta = ?SOcode; 

nprops = numel(SOcodemeta.PropertyList); 
validationclass = cell(nprops, 1); 

warning('off', 'MATLAB:structOnObject'); 
for ii = 1:nprops 
    fullpropmeta = struct(SOcodemeta.PropertyList(ii)); 
    validationclass{ii} = fullpropmeta.Validation.Class.Name; 
end 
warning('on', 'MATLAB:structOnObject'); 

Ve alırsınız:

>> validationclass 

validationclass = 

    2×1 cell array 

    {'double'} 
    {'struct'}