Object Oriented Programming question: creating child objects and sum one property of all children and the parent

조회 수: 6 (최근 30일)
Hi,
I'm just getting into matlab OOP and got stuck in creating child ojbects. I have a class like
classdef myClass
properties
myVar;
myNumber;
myName;
end
methods
function m = myClass(name,number,value)
m.myName = name;
m.myVar = value;
m.myNumber = number;
end
function printTotalValue(name)
disp(['Total value: ' num2str(name.myVar)]);
end
end
end
I can see the "total value" by running the commands
clear classes
a = myClass('apa',1,10);
a.printTotalValue;
I now want to create a hierarchy of objects, and whenever I call object.printTotalValue I want it to sum it's value and the value of all it's children, grand children etc. But how do I do this?
I want to index the hiearchy by myNumber, like this:
ObjNo1 (myName = "object 1"; myVar=3; myNumber=1)
.Obj11 (myName = "object 11"; myVar=1; myNumber=11)
..Obj111 (myName = "object 111"; myVar=30; myNumber=111)
..Obj112 (myName = "object 112"; myVar=15; myNumber=112)
..Obj113 (myName = "object 113"; myVar=2; myNumber=113)
.Obj2 (myName = "object 2"; myVar=1; myNumber=2)
.Obj3 (myName = "object 3"; myVar=23; myNumber=3)
..Obj31 (myName = "object 31"; myVar=6; myNumber=31)
And then I want to be able to call ObjNo113.printTotalValue and get 2 as result, ObjNo11.printTotalValue and get 1+30+15+2=48 as result, ObjNo2.printTotalValue and get 2 as result, etc...
But: *How do I create child objects like this? * *How do I get a list of all child objects and overload the printTotalValue function so it sums all the myVar's for the children objects? *
I've been googling for quite some time but can't seem to find an answer that gets me through this, so any help would be appreciated!
Thanks in advance, Anders

채택된 답변

Malcolm Lidierth
Malcolm Lidierth 2012년 7월 1일
편집: Malcolm Lidierth 2012년 7월 1일
You could try something like this:
classdef myClass < hgsetget
properties
ParentObject=[];
ChildObjects={};
myVar;
myNumber;
myName;
end
methods
function thisObject = myClass(name,number,value)
thisObject.myName = name;
thisObject.myVar = value;
thisObject.myNumber = number;
end
function addChild(thisObject, newObject)
thisObject.ChildObjects{end+1}=newObject;
newObject.ParentObject=thisObject;
end
function object=getChild(thisObject, n)
object=thisObject.ChildObjects{n};
end
end
end
Then at the command line:
>> a=myClass('Eve', 1, 22);
>> a.addChild(myClass('Cain',2,99));
>> a.addChild(myClass('Abel',3,999));
>> a.getChild(1).addChild(myClass('Enoch',4,1999));
printTotalValue can then just search upwards using the ParentObject entry until it finds it empty.
  댓글 수: 1
Anders Österling
Anders Österling 2012년 7월 2일
You're a star Malcolm!! Your code saved me hours - I was not even close to inherit from hgsetget before reading it!
I added a method for looping through all the children and then I was done. Here's the final code:
classdef myClass < hgsetget properties ParentObject=[]; ChildObjects={}; myVar; myNumber; myName; childSum; familyValue=0; addedMyVarBool=0; end
methods
function thisObject = myClass(name,number,value)
thisObject.myName = name;
thisObject.myVar = value;
thisObject.myNumber = number;
end
function addChild(thisObject, newObject)
thisObject.ChildObjects{end+1}=newObject;
newObject.ParentObject=thisObject;
end
function object=getChild(thisObject, n)
object=thisObject.ChildObjects{n};
end
function sumVar=loopThroughOffspring(thisP,sumSoFar)
%This function loops through all the offspring of an object and
%returns the myVar for each object.
noChildren = length(thisP.ChildObjects);
%update the sum with the value for this object
sumVar = thisP.myVar + sumSoFar;
%also go through all children of this object:
if noChildren >0
for i=1:noChildren
sumVar = loopThroughOffspring(thisP.getChild(i),sumVar);
end
end
end
end
end
in command window i run:
clear classes
a=myClass('Object 1', 1, 3);
a.addChild(myClass('Object 11',11,1));
a.getChild(1).addChild(myClass('Object 111',111,30));
a.getChild(1).addChild(myClass('Object 112',112,15));
a.getChild(1).addChild(myClass('Object 113',113,2));
a.addChild(myClass('Object 12',12,3));
sumVar = a.loopThroughOffspring(0)
and it returns 54 - the sum of all the .myVar.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Characters and Strings에 대해 자세히 알아보기

제품

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by