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

问题描述 投票:26回答:10

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

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

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

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

c# oop namespaces
10个回答
64
投票

我会说:

  • 命名空间:汽车的类别或品牌。请注意,该品牌确实无需决定汽车的制造方式。你不能说本田总有四扇门,或者它总是有4wd。这些具体细节取决于班级的要求。 Rich.Carpenter's post很好地解释了命名空间的用途。
  • 类:如何构建特定汽车的蓝图。
  • 对象:从汽车蓝图(类)创建的实际汽车(实例)
  • 方法:汽车用户可以做的事情。 Start()IncreaseThrottle()Brake()OpenDoor()等。
  • 属性:汽车包含的属性,信息和构建块。例如。总行驶里程,颜色,方向盘尺寸,立体声系统等。

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

  • 继承:当一个类基于另一个类并添加一些更具体的细节时。一系列的继承通常从最常见和最普遍的方面出发,一直到一个更具体无意义的地步。动物背景下的例子:动物 - > Mamal->啮齿动物 - >大鼠 - > RattusNorvegicus
  • 聚合:“构建”对象的属性。例如。 “这辆车是四轮,底盘,发动机等的集合体”。
  • 属性:描述对象的属性,通常不是其物理构造的一部分。例如。颜色,最高速度,发动机容量等
  • 封装:隐藏用户的某些属性,或保护某些属性不被错误使用(从而破坏对象)的概念。例如。您不要公开汽车类的齿轮属性以便自由更改。你封装它并确保在Clutch()之前调用SetGear()
  • 覆盖:如果一个类继承自另一个类,它还会继承该类的方法。覆盖基本上是在继承类用自己的必需行为替换这种方法的实现时。下一点的用法示例。
  • 多态性:一个难以掌握的概念,直到你开始实际使用它。它意味着引用一种非常特殊的对象,通过使用允许您忽略特定类型的通用引用(当您不需要知道它时)。例如。如果你想“阅读”停车场中每辆车的车牌号码属性,你并不关心该品牌是什么,或者即使它是拖车或摩托车或其他什么。为了能够做到这一点,我们确保车牌号是继承行中最常见类的属性(可能是Vehicle类)。所以你只需要处理列表中的所有对象,将它们称为Vehicle类,然后调用Vehicle::GetLicensePlateNumber()。任何需要一些特殊处理来检索数字的车辆都可以通过覆盖方法并使其按要求运行来实现此行为。因此,可以使用多种对象类型,就好像它们属于同一类型,但行为方式可能不同。

1
投票

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

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


28
投票

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

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

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

希望有所帮助。


13
投票

一句话:

对象是类的实例


3
投票

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

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

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

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

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


2
投票

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

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

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

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

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

属性是描述对象方面的东西,如NumberOfLegsIsSleeping


2
投票

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

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

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

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

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

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


2
投票

对象可以是类的实例吗?


1
投票

类定义对象的外观 - 它包含哪些数据,它具有哪些方法以及与之相关的其他类。

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


1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.