Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关于继承的一般问题_C#_Oop_Inheritance - Fatal编程技术网

C# 关于继承的一般问题

C# 关于继承的一般问题,c#,oop,inheritance,C#,Oop,Inheritance,我正在为医生创建一个日志系统,医生可以进去看病人,也可以看病人的X光片和属于X光片的图像 可以有多个患者 每个患者可以有多张X光片 每个X射线可以有多个X射线图像 以下是课堂布局: 我遇到的问题是,我似乎总是向患者询问信息,而不是患者.Xray或患者.Xray.XrayImage。这是正确的吗 例如: Patient有一个getPatient方法,该方法从数据库检索数据并设置Patient中的所有字段,目前为止效果良好 例如,我在数据库中有三张属于这个病人的X光片,我想创建3个patie

我正在为医生创建一个日志系统,医生可以进去看病人,也可以看病人的X光片和属于X光片的图像

  • 可以有多个患者
  • 每个患者可以有多张X光片
  • 每个X射线可以有多个X射线图像
以下是课堂布局:

我遇到的问题是,我似乎总是向患者询问信息,而不是患者.Xray或患者.Xray.XrayImage。这是正确的吗

例如:

Patient有一个getPatient方法,该方法从数据库检索数据并设置Patient中的所有字段,目前为止效果良好

例如,我在数据库中有三张属于这个病人的X光片,我想创建3个patient.X光片的实例,所以我在patient中有一个名为GetX光片的方法。这将检索属于该患者的所有X射线ID,并将ID存储在患者的列表中,这些ID将显示在UI中的下拉框中。当我在下拉框中更改ID时,会调用另一个名为Patient.getXray(int-XrayID)的方法,这将创建一个新的X射线实例,信息将显示在UI中

XrayImages的工作原理基本相同,只是Xray有一个名为getxRayImageId的方法

问题是我想处理一个类对象(Patient、X射线、X射线图像),但同时我不想从数据库中检索到超过必要的数据,所以这是一个好方法吗

感觉好像我没有使用正确的OOP编程,我应该忽略从数据库检索的数据量,使用正确的OOP编程,然后修复数据库性能

因此,我应该这样编写程序:

 Patient patient = new Patient()
 patient.getXrays() // This one should create a new Xray instance
                 // and Patient should have references to these instances.
 patient.xray[i].getXrayImages // This one should create a new XrayImage 
        //instance and Xray should have references to these instances.

另一个想法是:当下拉框值被更改时(在本例中),它应该从Xray和XrayImage类中检索数据,而不是从数据库中检索数据。我是否应该尝试将数据库中的数据加载到Xray和XrayImage类中一次,然后用户将获得信息,并在每次更改XrayID时对对象进行操作,而不是检索信息?

您所讨论的问题是加载策略。基本上,我们必须在这里区分和快速加载(这些策略的名称在不同的来源中可能不同)。顾名思义,延迟加载只在实际使用时从数据库加载值。相反,当从数据库请求任何根对象时,立即加载已经从数据库加载了尽可能多或可能必要的数据

这与面向对象的设计或继承无关。您可以以一种方式设计对象,而无需更改它们,使用一种或另一种加载策略

您选择哪种加载策略取决于您的应用程序和通常面临的用例。它们中没有一个是正确的或更好的

例如,快速加载通常会导致用户在新页面加载开始时等待更长时间,但当他单击此页面上的某个内容时,响应立即出现。与延迟加载相反:使用这种方法,开始时的页面加载速度很快,但对于使用页面时的所有微小重新加载,必须执行新的数据库访问,因此用户在页面上的每个操作都有很短的等待时间。作为开发人员,您必须决定哪种方法可能对用户更方便。您还可以尝试这两种方法,让用户测试您的应用程序,并向您反馈哪种应用程序让他们感觉更舒服


在某些情况下,约束可能会迫使您采用一种或另一种策略。例如,当您处理数据库中的大型对象层次结构时,急切加载策略可能会导致很长的加载时间。我在现实世界的应用程序中看到加载时间超过1分钟。您很可能不需要所有获取的信息。在这种情况下,有必要使用延迟加载。

“当下拉框值被更改时……它应该从……类而不是从数据库检索数据”是一种跳级的体系结构——当您试图设计应用程序时,这种方法是危险的(这就是这个潜在的离题问题所涉及的内容).我会同意你最后的想法。我不会去数据库做4次访问,我只会做一次访问,并带上与患者相关的所有信息。还有一点需要注意的是:你的标题与文章正文没有任何关系,因为问题正文中绝对没有继承权。这里看不到继承权。而且不需要它。而且不要很快优化。首先让它正常工作,你不会每分钟吸引成千上万的病人。完美的答案。我认为这与OOP有关,但我实际上在寻找的是我想要的是“急切加载”还是“惰性加载”。目前,我将使用“即时加载”,因为数据库中没有那么多数据,因此“即时加载时间”仍然非常快。再次感谢你的完美回答!