C++ テンプレートまたは Java 汎用オブジェクトに代わるものを作成する最善の方法を見つけようとしています。いくつかの異なる理由から、これを過去に何度かやりたいと思っていましたが、今やりたいことは、いくつかの関連クラスの saveobj および loadobj 関数の作成に関連しています。アイデアは、デフォルトの構造体を作成し、それをもう少し操作して、構造体を希望どおりに取得するためのルーチンの汎用セットを用意したいということです。
loadobj と saveobj を作成するために、オブジェクトのすべてのパブリック (問題ではない) および保護された (問題のある) 非一時的なプロパティにアクセスする必要があるため、単純に外部関数を使用することはできません。
次に、抽象インターフェースの使用を検討しました。ただし、抽象インターフェイスを使用すると、同じ問題が発生します。私のすべてのオブジェクトファイルに浮かんでいる貼り付けられたコードをコピーします。そこで、多重継承と組み合わせたある種の本格的なオブジェクトを使用することを考えました (私のオブジェクトのほとんどは、インターフェイスの基本的な概念から既に継承しています)。スーパークラスを使用すると、サブクラスの保護されたプロパティを公開できると思いましたが、そのようには機能しないようです。助言がありますか?
これは、保存 obj アプローチの多重継承アプローチ (これまでで最も近いもの) のサンプルです。
Serializer.m
% Serializer.m
classdef Serializer
methods
function [saveObj] = saveobj( obj )
% Get metadata about the Object
meta = metaclass( obj );
meta = meta.PropertyList;
for p = meta'
if p.Transient | p.Dependent
continue; % Only serialize the correct fields
end
saveobj.(p.Name) = { obj.(p.Name) }; % Serialize
end % for ( property )
end % function ( saveobj )
end % methods
end % classdef ( Serializer )
TestSerializerA.m
% TestSerializerA.m
classdef TestSerializerA < Serializer
properties
PropA = 'a';
end % properties ( public )
properties( Access = protected )
HiddenA = 'ha'
end % properties ( protected )
end % classdef ( TestSerializerA )
TestSerializerB.m
% TestSerializerB.m
classdef TestSerializerB < TestSerializerA & Serializer
properties
PropB = 'b'
end
properties( Access = protected )
HiddenB = 'hb';
end % properties ( protected )
end % classdef ( TestSerializerB )