gpt4 book ai didi

matlab - 在Matlab中B类的属性中使用A类的对象?

转载 作者:行者123 更新时间:2023-12-02 03:23:47 25 4
gpt4 key购买 nike

我是面向对象编程的新手,我想使用MATLAB OOP在MATLAB中编写代码。我有一个基本的问题:在MATLAB的OOP pdf(https://www.mathworks.com/help/pdf_doc/matlab/matlab_oop.pdf)中读到,使用类作为结构化数据比使用MATLAB结构更好。我的问题是:

我有A类,在A类的属性中,我想定义两个结构,名为doctor_info和Patient_info。从OOP角度来看,我应该使用A类属性中的Doctor和Patient类的对象,还是最好使用结构而不定义class Patient和Doctor类。如果最好定义两个类别的医生和患者,那么A类的伪代码是什么?

PS .:我搜索了很多关于matlab opp,堆栈交换和网络的信息,但找不到答案。在堆栈交换中,我在C ++中发现了一个相关问题,但答案不满足我:How to define an object from Class A in Class B

非常感谢你的帮助

最佳答案

从Matlab OOP的角度来看,struct或自定义类的选择在很大程度上取决于特定的应用程序以及对可维护性,可扩展性,性能等的考虑。

我喜欢structs,因为相对于自定义类,我发现它们的重量极轻,并且由于可以即时添加字段,因此非常灵活。
当涉及复杂的应用程序时,会想到structs的一些缺点:


字段是动态添加的:我知道我被列为加号,但这是一个加号,必须谨慎使用。 Matlab会很乐意在分配时将拼写错误的字段'geuss'添加到包含structguess中,并且一切都会好起来,直到没有。自定义对象不会发生这种情况,因为只能通过从dynamicprops继承并显式调用addprop(我认为)来动态添加属性。
所有字段都是可见的,并且可以分配给所有人。如果该应用程序旨在供不太熟练的用户使用,则隐藏某些信息或限制/限制分配变量或值可能会有所帮助或可能需要。
创建字段后,struct中的字段不能对struct的数据进行操作;在我看来,这是OOP成为主导编程范例之一的主要原因之一:拥有可以存储数据的东西(对象)并使其返回结果而无需关心其计算方式(如只要是正确的)。


但是,由于自定义类提供了所有增加的功能,因此也有开销。 Matlab的OOP模型的性能正在提高,但是我认为struct仍会像原始数据容器一样依靠原始性能。
而且,如果您不需要电源,则可以毫无问题地避免使用它。



使用自定义类可以获得的另一件重要的事情是可以自动在实例之间更新信息的引用。为了说明这一点并希望间接解决您的第二个问题,请考虑以下MedicalChart

classdef MedicalChart < handle

properties
doctor_info = [];
patient_info = [];
end

methods
function MC = MedicalChart(doc,pat)
if (nargin ~= 0)
MC.doctor_info = doc;
MC.patient_info = pat;
end
end
end

end


我可以使用两个结构定义属性并创建该类的实例:

>> doctor.name  = 'Joe'     ;
>> doctor.phone = '555-0100';
>> patient.name = 'Bob' ;
>> mc = MedicalChart(doctor,patient);
>> mc.doctor_info.phone
ans =
555-0100


但是现在我可能有一个问题。假设我有一个大型应用程序,而Joe博士有很多病人,每个病人都有自己的 MedicalChart实例。
struct doctor可以毫无问题地重复使用,以创建所有这些医疗图表,但需要在每个实例中复制所有医生的信息。
就内存而言,这是相当多余的,但不是很多。

但是,如果乔医生更改他的电话号码怎么办?
我们将不得不使用更新的 MedicalCharts重新创建所有 struct

通过创建从 Doctor继承的 handle类的Dr. Joe实例,我们可以避免重新创建所有实例以及重复数据的需要:

classdef Doctor < handle

properties
name
phone
end

methods
function doc = Doctor(name,phone)
if (nargin ~= 0)
doc.name = name;
doc.phone = phone;
end
end
end

end


现在我们像这样创建 MedicalChart

>> DrJoe = Doctor('Joe','555-0100');
>> patient.name = 'Bob';
>> mc = MedicalChart(DrJoe,patient);
>> mc.doctor_info.phone
ans =
555-0100


非常相似。但是由于我是从 handle继承的,因此一次内存中只有一个 DrJoe实例。
因此,对该对象所做的任何更改都可以在 mc中自动访问:

>> DrJoe.phone = '555-0111';
>> mc.doctor_info.phone
ans =
555-0111


这对于做很多类似数据库的事情来说是一个非常好的功能,而 structs根本做不到。

唯一想到的麻烦就是删除实例以及删除实例时引用发生了什么。
在我的R2014b安装中,删除 DrJoe效果很好,因为 mc创建了 DrJoe的本地副本。
实际上,患者应该没有医生,但是考虑到这一点会使示例复杂化。

(我认为,为了使一切正常工作,需要 Doctor跟踪 MedicalCharts的存在,并将其作为 destructor的一部分从其中删除。我认为这里不需要这样做,但我想我会提到它。)

关于matlab - 在Matlab中B类的属性中使用A类的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30518280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com