为什么之后调用超类的构造函数使用的对象不允许吗?

20视图(30天)
我有一个子类的“子类”两类“classA”和“classB”,进而“超类的子类。这是树的类:
超类有两个属性x和y。类“classA”和“classB”每个初始化x和y,做点特别的事情。然后我想要“子类”叫“classA”和“classB”构造函数来初始化同时x和y。但是类的方式建造,我遇到一个障碍。
这里是类的定义:
superclass.m:
classdef超类
% %属性
属性
x;
y;
结束
% %的方法
方法
函数obj =超类(x, y)
%初始化属性
obj。x = x;
obj。y = y;
结束
结束
结束
classA.m:
classdefclassA <超类
% %属性
属性
一个;
结束
% %的方法
方法
%的构造函数
函数obj = classA (a, y, z)
x = a * z;
obj@superclass (x, y);
obj。一个= a;
obj。z= z;
结束
结束
结束
classB.m:
classdefclassB <超类
% %属性
属性
b;
结束
% %的方法
方法
%的构造函数
函数obj = classB (x、b z)
y = z + b;
obj@superclass (x, y);
obj。b= b;
obj。z= z;
结束
结束
结束
subclass.m:
classdef< classA & classB子类
% %的方法
方法
%的构造函数
函数obj =子类(a, b, z)
obj@classA (0 z);
obj@classB (obj.x b z);%为什么这是不允许的,我怎么解决
%没有更换计算类中完成“classA”和“classB”?
结束
结束
结束
这给了以下错误消息:
“超类构造函数调用classB出现后,使用对象,或之后回归。”
几个问题:
1)为什么调用超类对象的构造函数使用后不允许吗?
2)我怎么解决,如果没有重新计算在classA和classB吗?我觉得我可能会重新设计类的层次结构。但它只是错误我不能像上面。
我用Matlab R2019a在Windows上10。

接受的答案

马特·J
马特·J 2019年5月30日
编辑:马特·J 2019年5月30日
我只能猜测为什么它将不被允许,但是我认为有危险在使用一个对象,是没有完成建造……喜欢喂养的婴儿出生,只有一半或开车只有一半的组装。
下面是我如何重新实现。在你的原始设计,这对我来说没有意义,classB构造函数应该集合x classA如果它已经设置。
classdef超类
% %属性
属性
x;
y;
结束
结束
classdefclassA <超类
% %属性
属性
一个
结束
属性(访问=私人)
z
结束
% %的方法
方法
%的构造函数
函数obj = classA (z, y)
obj。x = a * z;
obj。一个= a;
obj。z= z;
如果输入参数个数> 2
obj.y = y;
结束
结束
结束
结束
classdefclassB <超类
% %属性
属性
b
结束
属性(访问=私人)
z
结束
% %的方法
方法
%的构造函数
函数obj = classB (b, z, x)
obj。y = z + b;
obj。b= b;
obj。z= z;
如果输入参数个数> 2
obj.x = x;
结束
结束
结束
结束
classdef< classA & classB子类
% %的方法
方法
%的构造函数
函数obj =子类(a, b, z)
obj@classA (z);%设置x而不是y
obj@classB (b, z);%设置y而不是x
结束
结束
结束

更多的答案(2)

马特·J
马特·J 2019年5月31日
编辑:马特·J 2019年5月31日
这是另一个变化,接近你的原始设计。唯一的实质性的区别是,而不是子类的构造函数调用classA和classB,相反从这些类静态方法的调用。
classdef超类
% %属性
属性
x;
y;
z;
结束
结束
classdefclassA <超类
% %属性
属性
一个
结束
% %的方法
方法
%的构造函数
函数obj = classA (z, y)
如果输入参数个数
obj。x = ClassA.xcalc (z);
obj。一个= a;
obj。z= z;
结束
结束
结束
方法(静态)
函数x = xcalc (z)
x = a * z;
结束
结束
结束
classdefclassB <超类
% %属性
属性
b
结束
% %的方法
方法
%的构造函数
函数obj = classB (b, z, x)
如果输入参数个数
obj。y = ClassB.ycalc (b, z);
obj。b= b;
obj。z= z;
结束
结束
结束
方法(静态)
函数y = ycalc (b, z)
y = z + b;
结束
结束
结束
classdef< classA & classB子类
% %的方法
方法
%的构造函数
函数obj =子类(a, b, z)
x = ClassA.xcalc (z);
y = ClassB.ycalc (b, z);
obj.x = x;
obj.y = y;
obj.a =一个;
obj.b = b;
obj.z = z;
结束
结束
结束

马特·J
马特·J 2019年5月31日
第三变化,甚至接近最初你正在做什么。在这里,我们只是转移所有构造函数在普通类方法。
classdef超类
属性
x;
y;
结束
方法
函数obj =设置(obj, x, y)
obj.x = x;
obj.y = y;
结束
结束
结束
classdefclassA <超类
属性
一个;
结束
方法
%的构造函数
函数obj = classA (a, y, z)
如果输入参数个数
obj = obj.setup (a, y, z);
结束
结束
函数obj =设置(obj, a, y, z)
* z obj = setup@superclass (obj, y);
obj。一个= a;
结束
结束
结束
classdefclassB <超类
% %属性
属性
b;
结束
% %的方法
方法
%的构造函数
函数obj = classB (x、b z)
如果输入参数个数
obj = obj.setup (obj, x、b z);
结束
结束
函数obj =设置(obj, x、b z)
obj = setup@superclass (obj, x, b + z);
obj。b= b;
结束
结束
结束
classdef< classA & classB子类
% %的方法
方法
%的构造函数
函数obj =子类(a, b, z)
obj = obj.setup (a, b, z);
结束
函数obj =设置(obj, a, b, z)
obj = setup@classA (obj, 0 z);
obj = setup@classB (obj, obj.x b z);
结束
结束
结束

类别

找到更多的在子类定义帮助中心文件交换

社区寻宝

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

开始狩猎!