我如何能改变我的类定义不改变旧的行为对象(例如那些保存在MAT-file) ?

10视图(30天)
我想更新我的类的定义与新的行为不向后兼容的方式,但我还是希望能够使用旧的类的实例,让他们使用旧的类定义(即与旧的行为)。
假设我有一个名为MyClass(定义如下)的类,我有一些MyClass保存到MAT-file的实例。
% MyClass.m
classdefMyClass <处理
属性
价值(1,1)的两倍
结束
方法
函数obj = MyClass ()
obj。值= 0;
结束
函数v = getValue (obj)
v = obj.value;
结束
函数v =添加(obj, a, b)
v = a + b;
obj。值= v;
结束
结束
结束
现在假设我想更新MyClass的定义后,这部分MyClass的行为变化。
% MyClass.m
classdefMyClass <处理
属性
价值(1,1)的两倍
结束
方法
函数obj = MyClass ()
obj。值= 100;
结束
函数v = getValue (obj)
v = obj.value;
结束
函数v =添加(obj, a, b)
v = a - b;
obj。值= v;
结束
结束
结束
显然,这第二个版本的MyClass不是向后兼容的,因为它将取决于老的代码的行为。例如,添加的方法现在减去其输入而不是添加它们。
我如何更新MyClass的定义以这样一种方式,当我从MAT-file负载MyClass的旧实例,使用旧的类定义与旧的行为?

接受的答案

MathWorks支万博1manbetx持团队
有很多方法可以实现这一行为的维持一个类的不同实例的不同的行为。
一个简单的方法是使用策略模式:
通过这个设计,可以有多个类定义的行为不同,但相同的接口,你可以定义一个接口类或接口超类(这有助于避免代码重复)。
如。
% MyClass.m
classdefMyClass <处理
属性(访问=私人)
实例
结束
方法
函数obj = MyClass(实例)
如果输入参数个数< 1
实例= MyClassV1 ();
结束
obj。在stance = instance;
结束
函数v = getValue (obj)
v = obj.instance.getValue ();
结束
函数v =添加(obj, a, b)
v = obj.instance.add (a, b);
结束
结束
结束
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
% MyClassV1.m
classdefMyClassV1 <处理
属性
价值(1,1)的两倍
结束
方法
函数obj = MyClassV1 ()
obj。值= 0;
结束
函数v = getValue (obj)
v = obj.value;
结束
函数v =添加(obj, a, b)
v = a + b;
obj。值= v;
结束
结束
结束
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
% MyClassV2.m
classdefMyClassV2 <处理
属性
价值(1,1)的两倍
结束
方法
函数obj = MyClassV2 ()
obj。值= 100;
结束
函数v = getValue (obj)
v = obj.value;
结束
函数v =添加(obj, a, b)
v = a - b;
obj。值= v;
结束
结束
结束
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> > obj = MyClass;
> > obj.getValue ()
ans =
0
> > obj.add (1、2)
ans =
3
> >保存tmpobj
> >变化百分比MyClass的第9行。m“实例= MyClassV2 ();“
> >明确obj
> >加载tmp
> > obj.getValue ()
ans =
3
> > obj.add (1、2)
ans =
3
> > newObj = MyClass;
> > newObj.getValue ()
ans =
One hundred.
> > newObj.add (1、2)
ans =
1

更多的答案(0)

标签

s manbetx 845


释放

R2017b

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!