hi everyone welcome today today's master class on object oriented programming thanks for joining me um i'm hoping today that you're either in one of two categories either you're um uh using matlab but you think you need to start learning about object-oriented programming or perhaps you come from another language that is object oriented and you want to see how to do it in matlab for both of those p sets of people i'll be trying to show you what's going on today so thanks for joining me my name is lauren shore and i've worked at mathworks for over 30 years and i try to share my knowledge in classes like today's you might also find some interesting matlab tips um on the blog that i maintain on the mathworks website the art of matlab so let's get started okay so as i said the uh topic is object-oriented programming with matlab and um my agenda is basically why why bother with object-oriented programming we can get everything done or most everything done without it i'm going to make sure that for those who are new to this area that i talk about the basic concepts and terminology and i'll show you how to make a class it's pretty easy and then how to make classes more robust and i'll show you what i mean when i get that to that and i'll just talk in general about um more advanced features that are available that we won't have time to go through today really so the problem i want to talk about is um finding and locating um balloons or blips from radar that's been deployed up in some balloons basically and i have a sensor array that's going to do this and you can see what i have here is that i have two that are um staying at about minus i don't know whatever minus uh 30 degrees and minus or minus 45 degrees and minus and maybe minus 50 degrees and then i have this other one that's moving and as we go over time you can see that it's um being detected and identified different number of targets at different times and so i would like to show you as an example how i use that and a bunch of different programming techniques uh for working on it so um the first thing i want to do is talk about the um progression of different techniques so whenever we're talking about an algorithm and something like this we have data as well and we need to combine the two the algorithm has to actually work on the data to make this make sense and so we might have values like i might have ten dollars in my checking account and at the command line i might say um tell me the interest on my ten dollars and i multiply by point zero zero zero zero zero zero zero zero one and find out of course that i get nothing um but i don't need a fancy program for that and that's not something i do every day i don't need to automate it there's not a big deal with that um but as things get more um as i'm trying to solve a deeper problem i might want to take advantage of increasing sophistication and so it's not that hard but i might put some data into a variable and i might use that variable in a script and i'm you know might have a whole bunch of lines of code in order to analyze those data and i might want to say well i don't have just one variable i actually have a bunch of variables that are related so i might put them together in a table or a structure or something like that and i might operate them on on them with functions knowing that i might have another set of data coming along later and i want to reuse this this this algorithm that i'm creating um on new data over time and then finally we get to classes and classes um are an interesting uh construct because well you notice up here in the beginning when i was talking about the programming techniques the data kind of sat on their own and the programming if you will the algorithm sat on its own but in a class we actually join them together and classes have basically the algorithm piece which is called which are called methods in object oriented programming and the class also has data associated with it and those are called properties and so the scenario that i'm looking at is a sensor array and you can see the array of sensors here that are going to try to locate a weather balloon that's emitting transmitting a signal and the sensor array receives these different flips over time but of course they don't all arrive at the same time because they're spread apart so this one might if this was the nearest one it'll come to their first and maybe their next and so on and our goal is to process the blip um in such a way so that we can compute the angle of arrival how far is away and what angle you know is the blip here or is it somewhere over here for example in which case the arrivals would come in a different order maybe in different a sequence and so that's the problem that i want to try to solve here um so how can we implement the scenario and how can we make it robust um so i'm going to come over to matlab now and i'm going to show you what i would do with a regular procedural program only i have enough code here that um i am not going to um type a whole lot here i have stuff already written and what you'll see here is i have my script here it's a live script um so i've got um or it's a regular script rather and i've got my comments here and i can just run a section if i come to the editor i can run a section i use run a section in advance so often that i have a copy of it on my um quick access tool strip here toolbar and so i'm going to run a section i'm just going to make sure i have nothing in my workspace and now i'm going to define the signal that it's sending so if i come back to this picture this is sending a signal well what's what's inside that signal what's inside that signal is well in order to do what we need to do we need to know what the speed of light is because i'm going to take that with the frequency of the signal that we're using and compute the wavelength it has a certain wavelength and i'm going to give it an amplitude so that's what our signal consists of um i mean that those are the specs for the signal that's not the signal itself and then um i need to define right now we want to eventually find out what is the angle of attack or the angle of arrival but right now i want to assume i know it and do the problem in the forward direction eventually we want to go backwards and solve what's called the inverse problem so i'm going to have a balloon at an angle of arrival of minus 10 i'm going to say its range its distance from here is really really big it's basically in infinitely far kind of not really but pretty big and then i'm going to embed in the balloon the signal and so now i have something that's called a structure so if we look in my workspace i've got two different structures and i can click on one of them and you can see that this is a structure the balloon and it has three fields now in this case it has a single value the angle of arrival we happen to see it here the range 1 times 10 to the minus to 10 to the eighth and then embedded in there another structure so basically a structure allows me to um combine data that belong together but don't necessarily fit together like in a vector or in a matrix or even if i could it might be inconvenient because they're different units or something like that okay and how do i index in well if i go like this um let's just go like that you'll see that i index in here by saying balloon dot aoa so dot is the way i index into a structure and find the value of a field in the structure okay so that's what a structure is and many of you probably know what that is i'm not going to add any extra balloons right now i'm going to skip that and i'm going to define my sensor array and you can see it has a whole bunch of parameters that i need in order to try to figure out um how to make it work right it's got a number of detectors a number of samples and zero padding because it's actually going to use an fft algorithm underneath and from all these specs from the balloon and the sensor i'm going to actually make what the signal would be coming from that balloon based on that sensor what would arrive at that sensor and i'm going to get the array data from that and from the array data and the sensor information we have and i can show you i've got this here it's a whole bunch of ffts and things like that but you can come here and now i can say calculate the angle of arrival based on this we knew what it was to begin with it comes back and tells us it's at an angle of minus 9.5 well if you recall i made it an angle of 10 minus 10. so um i might want to figure out um whether even before i do something in the field you know if i want to have maybe instead of having um my number of detectors be 16 maybe i'm willing to spend money and make you know 3 000 of them but before i do that i might want to do an experiment um numerically to figure out if that's going to help me so um let's just work with the fft the sensor zero pad first and let me come in here and make that 256 and i'm going to recreate the data because i changed the sensor and here's the angle of arrival and it did get better and you can see i have a 20 48 there i'm an impatient person so i'm going to go right to the value that we found was really good for the zero padding and now i come here update my data and i get a much closer value closer to -10 than i had before and you can see it over here in this plot which is showing where the or peaks are the angles at which um there are potentially different arrivals and we can see one here at around minus 10. well maybe that's not quite close enough for me and i go well what else can i throw at it i don't really want to do a longer fft because maybe that will introduce too much latency into the calculation and i want to be able to keep track of these things very fast and so maybe i can change the number of detectors so i can say sensor dot num detectors equals um i had 16 i'm going to make it 32. since i changed the sensor i need to recompute the signal and i need to recompute the angle of arrival and it didn't change the number of detectors the more information i have from more different bases on the ground it's not helping me in a finer way find that well let's just try this again maybe 32 wasn't enough maybe i should do um 10 24. i mean i'm just this is just a simulation right so why not it didn't change it at all well let me come back up here and remind us we also had our signal speed of light one of the dangerous things about using structures and procedural programming is i could say signal dot and by the way if i just do dot i can hit the tab key and find out what's in there so i can change the speed of light equal to 33 that's not really good i'm going to come up here and actually reset it because i don't want to mess that up but you can see that i'm not safe that way so why didn't this work well i'm going to show you why it didn't work because i cheated and i'm going to open up sensor and now you're going to see that my original field was called num detector and i wrote num detectors and it just added another field it didn't warn me it didn't tell me it didn't give me an error message anything and so i'm a little bit um unprotected i can do everything i want it's sort of the wild west but there's nothing to put checks and balances on me at that time so it's a little bit scary it's very flexible but things can go wrong so let me come back to the slides for a moment so as i said it's pretty easy to learn we kind of didn't have to plan we could think about oh well what if we added this new parameter maybe that would help and you get to try things really quickly and um there's no formal relationship between the data and the functions though i'm not making sure that things i'm not doing any sanity checking and you see every single thing in that sensor and maybe some of those things aren't available maybe i'm going to switch a sensor someday and not all of those things are going to be available so i could have a problem if that were true i'm going to come here while i'm at it and change this to 96 and then i'm going to rerun this sensor and i don't get much closer but now what happens is if let me actually change that back for a moment let's leave that at 16 for the moment um whoops 16. and now what i want to do is i'm going to add two more targets so our signal is going to get be a combination of balloon number one balloon number two and balloon number three and you can see instead of it minus 10 i have one at 20 and one at 25 that i'm adding and now i'm going to just set up my sensor array compute the data compute the angles of arrival and and display the and now you see it doesn't find three it finds two and oh no it only finds one here that was left over from before it finds this biggest one here but this this peak even is enough lower that it decides it's not important enough um and that's again because at this point i don't have the right number of detectors so let's see if we can do better with the more detectors that we have let me run that create the new um sensor data and the field data and now you can see i get three balloons minus not quite ten i'm not quite 20 and and 25 and here you see on my plot i get the three different targets that we were looking for pretty closely now again but this was without doing anything formal to make this all work well that may be uncomfortable to a lot of us you know then you could start putting all kinds of error checking in the program do that but if you miss anything um maybe it's so obvious to you that the speed of light is what it is that you don't even think to make sure that someone can't change it by accident um for the purposes of your experiment so um um what i said before was that there was this progression of programming techniques and now i'm ready to think about using a class to help me out here to help me not make the kind of mistake if you will when i put numb detectors instead of numb detector in there and let me give you um some background on object oriented terminology and this is general object oriented technology not math work specific a class you might also hear it about about class programming classes are a blueprint for creating an object it's an idea classes also contain properties that are data and state related and behaviors which are algorithms or behaviors or actions an object is a specific instance of a class so if i have a class called dog the properties for that class might include breed age color and the things that can happen with a dog are eat sit and bark um now here's two instances of dogs my pal shawn's uh dogs lexie and luna and you can see they have data behind them they have alaska husky she's eight years old she's black and white and a cho well this isn't this isn't john's i don't know who luna is but luna is a chihuahua she's age four and she's brown and they can both do the same things they can eat sit and bark but the way they do that of course is different lexi may bark in a much less high frequency bark most of the time than a smaller dog a chihuahua so they don't do it exactly the same way they don't get the same value the same outcome but once you put their properties in you can do modeling and predictions so what i want to do now is i want to define a class that's a blip and from that class i want to create a balloon a balloon object and i want to use that object in place of the structure that we have so let me just come back here and what i'm going to do is i'm going to come to the home tab and i'm going to say i want a new class and matlab opens up this file for me it's basically a template i'm going to double click here and show you the whole thing right now and i'm going to make it of a class blip and i'm going to put some help in here flip um simple lip flip class this is why you don't want me typing because even on something as simple as that i make a mistake um yada yada you hopefully will use something more meaningful and now what properties do i have well what did i have before in my balloon if we look in my balloon here my balloon had aoa the angle of arrival the range and the signal so i'm going to come over here and i'm going to put aoa range and signal and at the moment i'm going to delete everything else because that's all i got and i'm going to um put an end at the end because the code analyzer was telling me to and because it's the right thing to do let me just okay and i'm going to save this whoops and i'm going to save it to blip now what what can a blip do well i can say b e whoa my keyboard got enthusiastic there my keyboard is being sneaky at the moment it's not letting me do anything one second sorry about that we'll be back in a moment well we'll let me do this i can cut that out and now come on keyboard you can do it i don't know all my equipment has a mind of its own today come on so i'm sorry about that folks for a moment my keyboard quit working and now it's working so b equals blip and you'll notice that blip doesn't have any values but i've got i can then say b dot um a o a and i could say equals minus 10 and b dot um range equals um whatever range i had before i think nope oh yeah it's uh wherever it is let me come back here we range let me go like that copy that was because it called the range function in matlab instead of what i wanted uh b dot range and um b dot signal equals the signal we have so now if i look at b it's got all this stuff in it and if i say um well let me start with something easier let me make an a a equals 17 str equals string i can say is a a is it a string oops and it's not you already know about classes even if you didn't think you knew about them is it a um uh double yeah is it a float yeah it's floating point because floating point is double or single is it numeric numeric yes but it's not a string and i can do the same thing with string and i say and say is it a string yes is it a character array nope is it a cell array because we used to put strings into cells and celeries nope so now i can say is a b my blip is it a struct no but you saw i sort of i'm addressing it like it is b dot a o a and so on but if i print out b you'll see that it's a blip that has properties and if i go like this it will bring up the help on blip which is very sparse it's a very simple class and so on and it doesn't have very much going on in it but it becomes self-documenting when i do this well that's nice what if i just come along here and i just say balloon equals flip so let me come here let's execute that now and i'm going to add my two extra balloons i'm going to add my sensors i'm going to create the array data and i'm going to compute the angles of arrival i get the same angles of arrival i get the same plot we had before but now my balloon is a 1 by 3 blip array and i can say show me balloon of one i can say show me balloon of three dot range and so on so you'll notice now i'm using regular indexing with the parens as long as well as the sort of structure indexing with the dots so the nice thing is my analyze data everything else just worked because the notation is the same even when i changed my balloon to the class blip now what else might i want to do with this class well i might you know i have three balloons it might be really a pain to dig through the signal and find out what the um the actual angle of arrival is there so what i can do is i can come back to blip now and i can add some methods and one of the methods i would like to add is and you do this in a methods block i'm going to put the methods and end in first is you can basically do whatever you want here i'm going to make a function you basically program these almost the way you program um uh regular matlab code i'm gonna have function it's gonna take in the object and that's the only thing it's gonna take in and actually that's gonna need to be an input the object that we're talking about is gonna need to be an input for any method that we create with one exception and i'm not going to get to the exception yet but i want to write the identify code so let me say my identifica code is going to be disp i'm just going to display hi i'm a balloon well let me not do that i'm friendly and arriving at my angle of arrival degrees don't shoot okay so i've got that right now so now let me save that and now let me say um let me show you a couple things blip but button uplift balloon when i do balloon dot if i hit tab you'll notice not just the properties but now identify is in there so i can call identify well for those of you from other languages you're used to this probably i can identify um well i actually have to pick a balloon not just one so let me do balloon of one of one identify and then since i'm calling a function i'll go like that and it says unrecognized variable it doesn't know what aoa is and in fact if you look here i'm going to show you the whole thing i have some um uh um messages warning messages from the code analyzer and it's saying um that the object isn't being used should it be a static method if you don't know what that is don't worry right now and i have another message that's saying confusing function call did i mean to reference the property aoa of my object and in fact i did i really want the aoa associated with the object that we've got and to do that what i do is i say give me the object aoa once i do that you see all my code analyzer messages get better and now i can come back here and we can identify it and it's at -10. for those of you who aren't used to oo programming i can call this like a regular function though i can say identify balloon of three and it just works that way okay now there's something else interesting notice when i look had to fill in my parameters for my balloons i had to create my balloon first and then i'd had to had to say it's aoa is this and it's range and i had to do all these assignment statements nine assignment statements here for three balloons but what if i want what if i know the answer right in the beginning and i want to set them up right away well i can do that in blip because one of the things that the class has by default is what's called a default constructor which is one that you don't need to write and that's what let me say balloon equals blip it let me just create one even though um i didn't say anything about it and it just created an empty one well i'm going to create um whoops i need this in my methods i want to put another one in here and i'm going to say function and it's going to have an output equals lip lip and i'm going to have as possible inputs an angle of arrival a range and a signal yes and i'm going to put the end on this function and then what i'm going to do is i if if those come in i'm going to say obj.aoa equals the aoa that's the input to my function obj dot range equals range and obj dot signal equals equal signal save so now i could say oops i could say um yeah balloon of three equals lip of 25 and um 1 e to the 8 was that yeah and oops signal and i get to do that all in one call notice i'm trading the um the three calls for one call here now if i might wanna sometimes have that default constructor then this won't work all the time it's only gonna work when i have three inputs so i can simply go if nr again is equal to is equal to three and and that if statement end it and then i control a control i i like to make things indented nicely so i can save that so i've got code now that will create the class let me put preset values in when i create it and do the identification um so um what we did is we defined a class from the class we were able to create the balloon object what i didn't show you though is something really cool i forgot to show you this balloon of one dot a aoa equals 13. it can't it doesn't recognize it because that's not the way i spelled it because matlab is case sensitive for these sorts of things so i present i prevented myself remember in the beginning i changed the numb detector i used num detectors instead i can't make that mistake anymore it's going to catch me and yet i don't have any code there specifically doing the argument checking it's what i get um that's part of the value of the class and so um so i created a class with properties and methods everything still works so far but the bad news is if we take a look um in my class um i've still got aoa range and signal and if i think about the sensor the sensor whoops the sensor here has everything else exposed the signal and sensor both but the sensor here where'd my sensor go here have everything exposed now these might be parameters that a particular manufacturer uses and they may um have several different ones with different sample rates or something like that or maybe they even let you change the sample rate of your own equipment that you bought from them but another vendor might make a sensor array that doesn't even have some of the notions of this maybe it doesn't worry about spacing or sensitivity and we've exposed all that information to the users and so we've maybe exposed more than we want to one of the things that you'll find if you notice and you use any classes that um come from math works toolboxes um we don't we deliberately hide some of that stuff we don't want to hide anything that will impede your using that particular class or creating objects that are useful but what we will do is make sure that you have access to everything you need but we try to hide the rest so if we change our mind later about something about how it's implemented behind the scenes it won't break your code because you can't be depending on something that you can't get access to at that point and that gives me a segue to what i want to talk about next which is we have all this information we have the number of sensors and sensor spacing and all those different things and plotting the results and maybe that's not stuff that you know in the middle of all this i need to synthesize the measurements i'm going to be computing an fft you don't need to the end user doesn't need to know all of this stuff um uh they might need to compute aoa they might not need to know specifically how we do that with the determining peaks maybe there's some other method of doing it instead and so what we'd like to do is basically get change the interface to be the smaller number of things that we need this is just the parameters here and these are which is the properties and these are the methods that we might need for the sensor and all the other things that were in there parameters or methods are internal to there and it should simplify the use of the object for you because this will be the only part that's documented not all all of the other pieces and so now when i make something like this it becomes a really nice building block for me while i'm doing that um i also might want to um uh control um how do i control that while i control it with these attributes that i'm going to use you can see that i can make the access public or are protected i can make the modificat uh modifications either dependent on one another if two things depend on one other are constant um so there's a bunch of things that i can do so um let me yeah come over to here whoops my mouse are not getting along now i'm gonna come back to my project here and i'm gonna come to um um number three and actually i'm gonna come to number four i think um number three no i'm gonna yeah i'm gonna whoops there's my blip that's my blip this is it's blip yeah i'm gonna come over to um project number part of project number four to show you something about encapsulation so um i have my blip you can see there's a class depth that's the name of the file has to be the same as the um actual class name and i've got my properties and i've got my methods here so it's basically what you saw me have before it's got that uh if nr n equals three constructor but now i've turned my sensor into a class as well and what i've done is i've put in some checking because the number of detectors actually needs to be a scalar so it's going to be a one by one it's going to be double so it must be in and i want to say it has to be an integer and must be positive because we don't want our detect to have minus three detectors zero padding must be integer and positive and you see i can set default values for them here but now some of the other properties of that sensor we don't actually need to make public and so what i'm going to do and by default they are public so what i'm going to do here is i'm going to keep this part um private and i'm going to make a new properties block properties and i'm going to go like whoops like this and i'm going to simply copy and paste and i'm going to make the properties gettable so people can read them but they won't be able to change them so i'll put an end on that and then i'm going to make another properties class because properties prop properties and we'll do the same thing but because i want these to be they don't need to know that underneath we're using some um the speed of light and they we don't want them to change it anyhow and um and now i'm good so i've got um you see i'm controlling things like default values i am protecting things in this case so that people can read them but they can't change them these they can read and change but they're restricted in certain ways and then these are things that they can't do anything about and i can do a similar thing with methods and i can have um for example the wavelength and the frequency are dependent on one another so i could actually come here and i could put in getter methods and what this allows me to do is say that there's some dependency here and in order to do that i actually have to come here and let me come up here and put an end on this and let me do prop whoops properties and um here we go dependent that doesn't look like right it doesn't want these values anymore since they're dependent take that out and now i have a blip class that is um if if the spacing changes somehow um we can calculate the wavelength and vice versa they're related here so we get information and i have some other methods i can have the compute aoa method and i want to make that one public because we're going to need that for the sensor and um i need to create the sensor signal because of creating the synthetic data rather than getting it in the field and then i could make these other methods protected if i want to i'm not going to spend the time on that right now but you'll notice that now i have the speed of light being constant so let me come back to my analyze data here now and let's um come and run this so let's clear everything let's do signal okay and now let me come back here and we have our signal which is the speed of light and i can say signal dot speed of light equals 34. oh didn't you shouldn't have let me do that did i save this oh i have the old blip no um i did that i did something silly well here's my best way out of something silly that i've done let me come here um because i've got it in here and if i look here at my sensor now if i use this i've got my analyze class let me clear everything out here so you can see it i'm going to run here i've got my signal dot speed of speed of light equals 34. oh it's still letting me it must be must not have i must not have set that properly okay um oh that's the signal i'm it's the sensor that i was doing ah sensor answer dot speed of light equals 34. oh it's still letting me do that too okay um oh because i have the old one i didn't run the new code sorry i am confusing everything here um let me come here um well let me not worry about that right now i'll show it to you in a minute because i want to go on to the next topic um which happens to be um well first of all let's find out about attributes i'm going to say um property attributes so what kinds of things can you change here and you're going to see i'm looking up attribute property attributes in the documentation comes up with a nice page here and you'll see that properties from matlab i can set whether or not to a different value abstract classes meta information right here um constant dependent and a bunch of information a bunch of different things whether or not you want to allow partial matching so if someone doesn't type the whole thing they can move ahead um so a bunch of information in the documentation there are many many examples in here you'll see that there's properties there's class definition there's programming and there are plenty of examples when it comes to this so if you come to the examples here you might want to look at some of those to help you out too okay so i want to talk about um inheritance and then i'll show you a little bit more about the properties as we go um so suppose i have right now my blips or my balloons are stationary in the sky kind of like a weather balloon or something like that but what if one of them gets a string cut off and it's moving along it's still a balloon and i can probably still find the angle of arrival from it but it's going to be changing over time so if i have something that's moving that could still be a blip but it's just a different blip than the way i've programmed things for but it has many things in common with everything i've done before here too and this is where we get into inheritance rather than creating a second complete body of code what i can do is i can say my moving blip is still a blip so use a lot of the goodness that we've got in our blip class and then um take advantage of that and then add the differences or the extra things that we need for the fact that it's moving now so here's an example if we have our main class the base classes and employees they all we all start off with name dress address and department and we might have two different kinds of employees a sales person and an engineer and there's different information that we track on them the salesperson might need to know have associated with her him a region and their commission structure and an engineer would need her products and her team and there might be another subset under there underneath engineer there might be a specific kind of test engineer that has assigned to to him or her the test stage that they're using and so i don't want to throw out everything i want to have these also include the name address and department that they're in so way i do that is i could say i can make a class deaf engineer that inherits from employees and a class test engineer that inherits from engineer now um i want to take a a little side tour for the moment because um because the way matlab works and the ways classes work um are important in terms of understanding when matlab makes a copy and when matlab uses something even if it seems like it's a copy so if i type this a equals four b equals three and now i say um no and v equals three let me say b equals a and now let me say a equals three what value was b well if you saw before the last time i signed it it was 4 and yet i just changed but it came from a and so if i look it actually kept its value 4. so it keeps its value um but what if i do something like this h dot um let me make a line in a plot bring up our plot here's our handy plot i'll put it over here and i'm going to say here's a capital h equals our lowercase h and now i'm going to say capital h dot line width ah line width equals 15. notice how the that changed the property over here if i say that was capital h show you there that was capital h if i say h dot line width what do you suppose it is is it what it was originally which was um 0.5 no because uh it actually is a capital h and lowercase a h are actually very closely related they're references for the same thing um it's because our objects our graphical objects are part of a handle class in matlab and the handle is a reference to a specific object that exists values make separate copies as they go although we do a lot of things about making sure we don't make copies really we we make them we make sure we're very parsimonious about it but you can think about them each as if if i say a equals three b equals a a equals four it's as if we make copies all along um and so a deep copy whereas the handle just inherits the whole behavior and the whole aspect of whatever was a reference so you'll find that most objects in matlab most classes are our value ones like anything numeric is likely to be that but most things you write and things that we write that are graphics or file system things they may well be handle classes so why use them okay well i think i showed you that um let me think about what we want to do here so remember i've got my sensors here um let me see if i've got a thought for that so in in this case i want to make a new class because i want to make a moving blip from a blip so you're going to see that i inherit from blip and the extra property is the amount it moved from the in one step whatever that means okay and my moving blip is going to have some information in it it allows us to re-envision and re-implement things from the super class the class that we're inheriting from but it uses a lot of the code that's already there so we don't have to rewrite the code and really importantly if we find a bug in that code or a behavior change we want to make you get it automatically in the subclass and you can also as it turns out inherit from the base classes in matlab also so let me come here and show you this so i have a class the moving blip now the moving blip as i said is inherited from blip i'm not clear to close everything right now it's got one property or does it um if i make a moving blip does it have one property well remember it inherits from blip and blip had three properties so let's say mb equals moving flip it has four properties it's got the original ones from the inherited class and it's got the new one the delta aoa and you can see that the way i create a moving blip i have um a constructor here and my moving blip says basically um get the object the um the information from the extra parameters in case someone passed them in um and put them into our object but we want to take the last three and call our superclass and this is what i do to call the superclass i say for my object my moving blip here call the super class blip and call just with those final arguments and if um the number of input arguments is greater than or equal to one which it hopefully will be um we want to fill in a delta aoa value and then it's got a method called move and notice that to move it what i have to do is i have to somehow say what happens to the object and i have to say that the object was at aoa and its new aoa is its old aoa plus the object's delta aoa and then we just move it and and negate it um after a while so that it doesn't move as we go because i'm going to show you how i want to use this blip did change the only change here is we made it a handle class as well and everything else is the same now let me come to analyze this so we come here this is the co whoops um i am i'm trying to run something that i was i was not on the right line okay so clear everything set up our signal set up arm blip now notice here that because a blip is not a moving blip necessarily it might be but it might not be but because these things might be different i have to put them into some other data type that will let them um join together and so i'm putting the blips each of my um information about the aircraft into a cell and a cell array here so i've got three blips now and if we look at balloon oops see it's a one by three cell and we can do balloon and i can get the contents out of number two and it will show me that it is a blip and all the information and i can get number three and what you'll see is that it's a moving blip okay and now i need to create my sensor array information and i need to create the angle of arrivals and now what i'm going to do and the angle of arrival start off at the original positions roughly minus 10 20 and 25 and i'm going gonna um i'm gonna keep i'm gonna park this in here for the moment and i'm gonna make this a little bit bigger um what you'll see is now i'm going to um move my balloon um in a loop here a few times so let me run this and watch the plot as we go and you can also watch the output if you want well no there won't be any output there coming out but you can see it is keeping the two in here in place and then it hit to near minus 65 it get too big and so it went back and then forth again because we were moving it remember i didn't let it wanted to get way far away from the other ones so we moved it so that you could see that one update as we went and so um i could then call the move function and that's with a pretty minimal amount of changing to the code that you have so i want to come back to the slides and just remind us that the subclass substitutes for the super class remember i was able to use a moving blip for a blip in this case i did change everything in this case to a handle because i knew i might want to combine blips with moving blips and by the way because this is a moving blip i can come into my moving blip um i don't need to return the object because it's a handle class so if i take this out right now and run it again uh over here just this section it works because being a handle class i don't have to return it as an output it's changing itself and you're seeing that happen right there um if it were a um value class you absolutely need the output there back here the obj equals move option because otherwise it doesn't update the object um because it needs to be in the output okay so um we really changed a very small amount of code to get some extra new functionality to allow these things to be free-ranging and um now i'm just going to talk very briefly i told you about inheritance there's this notion of events and listeners so suppose a balloon comes untethered um should the balloon um be responsible for telling everyone hey my tether let go or should anyone who cares be listening for it and we think that what should happen is the balloon should just issue basically a message and say an event and say hey i became untethered and and say a name of what it wants what it wants people to listen for and anyone who wants to any other classes anyone else can listen for that event and that way your balloon your blip does not need to know about other classes that someone may build in the future that want to take advantage of it it's just saying here's events that you can track on me and then it's up to you whoever you are to actually put a listener on and say did something happen and then if it did then you get to do and make some changes based on that um and there are some um examples in the documentation for that so i haven't covered everything but i just want to go over and over quickly and show you a little bit more matlab has been fully object oriented for well over 10 years now class definitions methods and properties we showed you events and listeners i just talked about i didn't show you overloaded operators but if it made sense we could overloading operators and function names so for example if i wanted to i could create a plot method for balloons that would plot them and i could use the name plot and it wouldn't interfere with matlab's regular plot function because this one would only work on blips so you can reuse good names if it makes sense i can i can change the access of properties and methods you can have handle classes and not just value classes there are destructors as well as constructors so when something gets deleted what else do you need to do well an example why you might need that is if you've opened um a class a file as part of your your class action your destructor might want to close the file gracefully i've showed you right now classes defined in single files and my file was getting a little bit long but there are ways of taking that and breaking it apart into multiple files if you want we get also static methods and i showed you a little bit about property validation you can use packages to control the namespace but already even without that the classes they having things protected or protected you can actually keep the name space somewhat limited and not let you just expose what you want and you can have object arrays and the nice thing about these are they behave like regular matlab arrays they obey regular matlab indexing and if you don't want them to you can program that in as well if you're interested in doing more with this um i already said many of these things we also allow you to have heterogeneous arrays and mix-ins and um what a heterogeneous array would allow me to do for example is to put um blip or a mip blip and a blue moving blip into one just one kind of class like we have right here and use regular concatenation rather than having to put them in a cell array and if i do that um it makes the notation a little bit simpler but it depends on what you need whether that makes sense and is really important for you you can always inquire about uh information about the class on a object or on a class and i already mentioned uh custom indexing we also have um some help for you in terms of in that the testing doing unit testing on your classes and if you're interested we have a matlab training course on object oriented programming that of course goes into much more detail than i have just now it's a two-day course and you get to practice a lot of this and of course these days it's also available online and depending on what university you're at if you're at a university you may well have access to mouths which would give you access to an online version of this class there's also additional resources in the documentation that i urge you to go look at the documentation is very good and very complete i think it doesn't mean it couldn't always use more but it has it's been able to answer my questions when i bother to look and i now want to just finish i want to thank you very much for joining me today um it's been a pleasure and i hope you learned a lot about oo um i want to point you to two events in the links below on the youtube page um the first one is the matlab expo 2020 on demand it's an online site featuring technical talks covering a broad range of topics where mathworks products play a central role and if you're interested in more about simulink we currently have a simulink student challenge um in process and you could be the winner of a thousand dollars and um please also don't forget to subscribe to the mathworks channel to get reminders for events like these thank you so much you