2014-07-03 66 views
2

我很难选择一个类是具体的还是抽象的。另外,我不完全知道层次结构中的哪一点会使事情变得具体或抽象。问题是,我们如何确定一个类应该是抽象类还是具体类?你怎么知道什么时候一个类应该是抽象的?

+0

如果您可以提供一个[最小示例](http://stackoverflow.com/help/mcve),那将会很好,如果您想要一般答案,请参见第一个结果(https:// www.google.co.in/search?q=when+to+use+abstract+class&aq=f&oq=when+to+use+abstract+class&aqs=chrome.0.57j0l3j62l2.6617j0&sourceid=chrome&ie=UTF-8#q=when +到+使用+抽象类+ + +中爪哇)。 –

回答

3

一般来说,如果您完全没有理由创建该类的实例,则该类应该是抽象的。例如,假设您有一个Shape类,它是Triangle,Square,Circle等的超类。由于“Shape”非常普遍,因此不应该有任何理由构造Shape对象,所以它应该是抽象的(或甚至可能是一个接口)。

+0

所以可以肯定地说抽象类是一种我们感官无法感知的类。就像Shape只存在于_concept_而不是实际的对象一样。 –

+0

这听起来很安全。例如,尽管可能有一个抽象类“Car”,其中包含“Truck”或“Jeep”等具体子类。 –

0

当所有子类都有一个共同的行为时,应该有一个具体的方法。

例如,车辆是一个抽象类,然后它由燃料驱动。这将是所有车辆(自行车除外)的常见行为 - 所以应该用具体的方法来描述,其他功能如班级(2轮车/ 4轮车),跑步细节(里程0-20/0-80),动力细节100cc-400cc)对于不同的车辆会有所不同,所以它应该抽象的方法。

1

抽象类意味着它是抽象的不完整。它需要另一个类来完成它和/或其功能。您需要扩展抽象类。

几件事情要记住,当你选择抽象类:

  • 你想要的类不应该被实例化。
  • 您想要继承此类
  • 该类不完整,并且继承类必须完成其定义(通过重写抽象类的抽象方法)。
1

把一个抽象类想象成一个普通类,其中一些方法将在后面定义。

例如,您想要访问数据库,但不知道将使用哪个数据库。因此,您可以编写打开连接的部分,启动事务,访问数据库,关闭事务并释放连接。但是,由于该部分是数据库特定的,因此您将未实现获取连接的部分。所以,例如,访问MySQL的人会扩展你的类,并且只需要实现获取连接的部分。

+0

同意你的例子,不会使用它作为一个更好的选择接口? –

+0

不,因为该接口将无法保存示例的样板代码。 –

0

在我看来,抽象类和具体类之间唯一的区别是抽象类不能被“新”。

您可以在具体类之前放置一个抽象关键字来阻止其他人重新获取此类的对象。 (抽象类不一定要有抽象方法)

我建议你用接口而不是抽象类,因为Java是单继承,一个类只能有一个超类但可以实现多接口。

0

一个抽象类是不错的选择:

  1. 如果你认为你会使用继承计划,因为它提供了一个共同的基类实现派生类
  2. 如果你希望能够到宣布非公开成员。
  3. 如果你认为你需要当你想一些方法与定义来添加方法在未来
  4. - 这样一个抽象类可以有实际的实施细则非抽象的方法。
  5. 但是请记住抽象类不能实例化。它只能用作扩展抽象类的其他类的超类。
相关问题