2012-10-22 258 views
0

我(作为新的oop和c#hobbiist)想要就以下(简化)问题寻求一些指导:作为属性的对象?

我已经做了一个小类(让我们称之为A),有4个属性,和很少的方法。也是一个更大的类(B)〜10 props,它应该包含12个A类对象,并且有相当多的功能可以与道具一起玩。我有我的主类M(这是一个Windows窗体),一个Filereader类(F)来处理所有的I/O。

我在wm_devicechange上做了一个windows事件,应该读取usb,制作F的一个对象。现在,当F读取文件时,它应该填充类B中创建的对象的属性F.现在的问题是,我不能从我的主类访问B的这个对象。问题是如何做到这一点?

我应该做一个属于B型的F属性吗?这是常见的做法吗? 我应该在我的主课堂中做B的对象吗? 当在B类型的F中创建一个属性时,如果从M中获取,是否只存储和传递参考?

我想尽量避免对象的无用复制等,但是这个话题对我来说是非常重要的,即使在几本书之后,我甚至不确定这个问题是否有很大的意义。我已阅读this文章3次,但我仍然困惑处理这样一个“问题”的好做法是什么?

感谢

+1

我已经读过你的问题,如3-4次,仍然无法弄清楚究竟是什么问题。请发布一些代码。 – LightStriker

+0

尝试创建一个简单且自包含的* code *示例,帮助解释您已完成的工作以及要求的内容,并将其发布到此处。 =) –

+0

如果你显示你的类型定义,这个问题将更容易回答。 – Jodrell

回答

1
public class Form 
{ 
    USBReader reader; 
    CollectedData data; 
    public Form() 
    { 
     reader = new USBReader(); 
    } 

    public void ReadUSBData() 
    { 
     data = reader.ReadUSBData(); 
    } 
} 
// Type F 
public class USBReader 
{ 
    public CollectedData ReadUSBData() 
    { // usb read logic. 
    } 
} 

//Type B 
public class CollectedData { 
    List<A> list = new List<A>(); 
} 

public class A { } 

一个简单的实现可以像这样你的USB阅读器返回数据。

通常,像读取数据这样的动作是对象上的方法,它带有返回类型的数据模型(这里是B和A)。属性是对象的属性。例如USBReader可以有一个自我解释的名称,如int BufferSize;

+0

我现在正盯着你的答案,我认为它是我正在寻找的那个。如果我理解正确,我将能够从我的Form类访问所有getter setters和'data'的公共函数? – Onsightfree

+1

在此期间我已经尝试过它,它的工作原理非常奇妙。关于这个环节,如果第二起案件发生在这里,那么我完全明白发生了什么事情。 http://rapidapplicationdevelopment.blogspot.de/2007/01/parameter-passing-in-c.html - 所以我接受你的解答作为答案,非常感谢NileshChauhan – Onsightfree

+0

确实如此。 reader.ReadUSBData()在内存中创建一个对象,其地址返回并最终在数据中捕获。您可以使用哪些数据作为句柄进一步操作。 – NileshChauhan

0

你不会浪费的对象分配空间,因为所有 对象 类在C#是reference types。然而,在我看来,你应该inheritancenested classes

之间 决定继承,你会做这样的事情:

public class F : B 
{ 
    //class F definition here 
} 

对于嵌套类,你将有:

public class F 
{ 
    public class B 
    { 
    } 
} 
+0

也有价值类型的对象。 – user1610015

+0

抱歉,你是对的,将修改我的答案。 – rexcfnghk

0

如果分配对象,它只是参考,所以同样的例子。如果您需要在两个对象之间共享对象,请将该对象作为参数传递给构造函数或某个方法/属性。然后,所有具有此引用的对象都可以访问相同的实例(数据)。如果您需要不同的“数据集” - 实例,只需创建其他对象实例...

+0

感谢您的回答,这是我的想法,但从来不敢写自己 – Onsightfree

1

您提到的所有方法都是合理的,但其中一个方法可能会更加直观和优雅。

B类究竟是什么?如果这是读取文件的某种结果,那么您可能希望从执行读取的某种F方法中返回它。

+0

这个B类应该包含我从USB读取的大部分信息。然后根据用户输入我即将操纵数据,几步后,我会覆盖USB上的文件。 表格处理用户输入,但软件的核心应该是用最小化读写操作来处理一些文件。 – Onsightfree

+0

然后我认为你应该在USB阅读器类的构造函数中进行所有阅读,并将信息存储在B对象中,这应该是USB阅读器类的属性。 – user1610015

+0

感谢您的回复,如果可以的话,我很可能会赞扬您的答案,但是错过了15个repu。我认为它也帮助我理解,就像NileshChauhan的回答 – Onsightfree