命名空间,类,对象和实例之间有什么区别?

时间:2009-05-04 11:58:17

标签: c# oop namespaces

我正在阅读Heads First C#(它非常有趣且用户友好),但我想知道是否有人有一个有用的比喻来描述名称空间,类,方法,属性等如何“合在一起”? / p>

类是父类,方法是小孩等,还是更复杂?

一个名字空间可以是一个房子,一个班级是一个房间(浴室),一个方法可以在那个房间里做什么(洗涤等),属性是做这项活动时可以做的事情,用肥皂,热水......

......我会得到我的外套。

10 个答案:

答案 0 :(得分:64)

我会说:

  • 命名空间:汽车的类别或品牌。请注意,该品牌确实无需决定汽车的制造方式。你不能说本田总有四扇门,或者它总是有4wd。这些具体细节取决于班级的要求。 Rich.Carpenter's post很好地解释了命名空间的用途。

  • 班级:如何制作特定汽车的蓝图。

  • 对象:从汽车蓝图(班级)创建的实际汽车(实例)

  • 方法:汽车用户可以做的事情。 Start()IncreaseThrottle()Brake()OpenDoor()

  • 属性:汽车包含的属性,信息和构建基块。例如。总跑步里程,颜色,方向盘尺寸,立体声系统等等。

一些看起来更先进的概念。也许现在有点矫枉过正了,但如果你有兴趣可以阅读:

  • 继承:当一个类基于另一个类并添加一些更具体的细节时。一系列的继承通常从最常见和最普遍的方面出发,一直到一个更具体无意义的地步。在动物的情况下的这种情况的例子:动物 - > Mamal->啮齿动物 - >大鼠 - > RattusNorvegicus

  • 聚合:“构建”对象的属性。例如。 “这辆车是四个轮子,底盘,发动机等的集合体。”

  • 属性:描述对象的属性,通常不是其物理构造的一部分。例如。颜色,最高速度,发动机体积等。

  • 封装:隐藏用户的某些属性,或保护某些属性不被错误使用(从而损坏对象)的概念。例如。您不要公开汽车类的齿轮属性以便自由更改。您封装它并确保在Clutch()之前调用SetGear()

  • 覆盖:如果某个类继承自另一个类,它还会继承该类中的方法。覆盖基本上是当继承类用它自己的必需行为替换这种方法的实现时。下一点的用法示例。

  • 多态性:在您开始实际使用它之前需要掌握的难题。它意味着引用一种非常特殊的对象,通过使用允许您忽略特定类型的通用引用(当您不需要知道它时)。例如。如果你想“阅读”停车场中每辆车的车牌号码属性,你并不关心该品牌是什么,或者即使它是拖车或摩托车或其他什么。为了能够做到这一点,我们确保车牌号是继承行中最常规类的属性(可能是Vehicle类)。因此,您只需要将它们称为Vehicle类,然后调用Vehicle::GetLicensePlateNumber()来处理列表中的所有对象。任何需要一些特殊处理来检索数字的车辆都可以通过覆盖方法并使其按要求运行来实现此行为。因此,可以使用多种对象类型,就好像它们属于同一类型,但行为方式可能不同。

答案 1 :(得分:28)

将类视为对象和方法的描述,将其视为对象可以执行的操作。

例如,我设计了一辆新车。该车的计划或蓝图(类)用于创建实际的,实体的汽车(物体)。那些计划表明汽车应该有功能喇叭。因此,我已经将鸣喇叭功能(一种方法)设计到汽车中。那些计划还表明这辆车有四个轮子。车轮将是汽车的一个属性,具有实例化(在创建对象时分配给属性)值为4.颜色将是另一种可能的属性。属性描述对象质量或特征(颜色,高度,宽度等)。

现在,我为丰田工作(不是真的,但请耐心等待我)。丰田将是包含我的汽车蓝图的命名空间。由于福特,通用汽车等都可以拥有自己的汽车设计(类)以及相同的名称(汽车)和方法(鸣喇叭),丰田,福特和通用汽车的名称空间将这些蓝图(类)分开, distinct,因为当应用程序具有不同的名称空间时,您可以在应用程序中拥有多个版本的类和方法。

希望有所帮助。

答案 2 :(得分:13)

用一句话说:

对象

实例

答案 3 :(得分:3)

通过对房屋蓝图进行类比。

蓝图是一个类。它指定了许多细节,但也遗漏了很多属性,比如房子的颜色,前门的颜色和样式等等。你知道,通过检查蓝图,门将会在哪里,并且一扇门。

对象是您根据该蓝图构建的房屋。您可以使用相同的蓝图建造许多房屋。它们都具有相同的整体外观和布局,但属性可能会有所不同,如外墙涂料的颜色,前门的风格等。虽然前门在所有房屋的同一个地方。

您可以从特定的蓝图中调用这些房屋的每个房屋。

所以,正如@yx如此雄辩地说,对象是一个类的实例。

答案 4 :(得分:2)

类通常用于表示某种对象。它可能像发票这样的物理对象,但它也可能更抽象。

动物有时被用作课程的例子,因为我们熟悉动物的工作方式。所以,让我们使用一些动物:

类可以是一种动物,如CatDog。当你创建一个类的实例时,它就变成了一个特定的对象,比如Fido the dog。

命名空间用于逻辑地对类进行分组,因此CatDog类可以放在命名空间Animals.Pets中。尽管命名空间是分层的,但这并不会使它们中的类成为分层。它们只是不同的组,因此Animals命名空间中的类不会自动成为Animals.Pets命名空间中的类的父类。

方法是对象所做的事情,例如Eat()Sleep()

属性是描述对象方面的内容,例如NumberOfLegsIsSleeping

答案 5 :(得分:2)

我会说你的班级可能是工作岗位,执行不同的行动(换句话说,行动就是方法)。您可能有各种各样的人执行操作(对象的各种实例)。

这些职位集合将驻留在某个部门。财务有其工作/班级(会计师,簿记员......),但他们需要与销售人员合作,他们有自己类型的工作/班级。

从这个意义上讲,各个部门都是命名空间。在销售部门工作的人最终需要与财务部门合作。多个部门(或名称空间)正在共同努力以实现目标。

现在这些部门可能是公司的一部分;该公司将成为所有这些部门的根名称空间。通过这种方式,名称空间可以存在并嵌套在一起。

简而言之,命名空间几乎将职责分开。

想象一下,多家公司合作(Microsoft .net命名空间与您自己的命名空间一起工作),您可以获得更大的信息。

答案 6 :(得分:2)

对象可以是类的实例吗?

答案 7 :(得分:1)

一个类定义一个对象的样子 - 它包含哪些数据,它有哪些方法,以及它与之相关的其他类。

实例是该类的单个创建实体 - 它是使用类定义作为参考创建的对象。

答案 8 :(得分:1)

类是一种对象。例如,您可以根据需要拥有一个类的对象。

实例是一个对象,有时这两个术语可以互换使用,因为在许多语言中,所有对象也是一个类的实例。人们使用“实例”这个词来明确表示他们不是在讨论一个类,而是一个类的对象。

答案 9 :(得分:1)

是对象的模板。它是源代码,告诉编译器哪些成员变量和方法进入该类类型的对象。

对象实例实际上是一样的。从类模板中,您可以创建该类的许多实例(或对象)。每个人都拥有在类中定义的所有成员和方法,在自己的内存中(尽管您可以拥有共享成员,并且方法几乎总是在实例之间共享)。