1
63
没有设计师
对象的任何方法都能从抽象中获益吗?
可以说有些方法会从中受益。采取
所以我想答案是否定的,对象的任何方法都不会从抽象中受益。 将对象类标记为抽象类是否有好处?
假设所有方法都实现了,标记对象抽象的唯一效果就是它不能被构造(即
使用一个简单的对象进行同步的实践是否足够具体化?
许多其他的答案都是关于构造一个简单的对象来在
是否有任何其他因素可能会受到使对象抽象化的不利影响? 有几个领域,从纯粹的设计角度出发,可能影响了选择。不幸的是,我对它们的了解还不够,无法扩展它们。但是,如果其中任何一项对决定产生影响,我都不会感到惊讶:
还有其他原因吗? 有人提到它可能与反射有关。然而,反射是在物体设计完成后引入的。所以,它是否影响反射是没有意义的——这不是原因。仿制药也一样。 还有一个令人难忘的观点,java.lang.object是由人类设计的:他们可能犯了错误,他们可能没有考虑过这个问题。没有语言没有缺陷,这 可以 成为他们中的一员,但如果是的话,那就不是什么大问题了。我想我可以放心地说,没有雄心壮志,我不太可能参与设计这种广泛使用的技术的关键部分,尤其是持续15年的技术。多年来一直很强大,所以这不应该被视为批评。 说了这句话,我就把它抽象化了;-p
总结
|
2
24
的普通实例
还有——为什么它是抽象的?因为它作为一个实例本身并不能完全发挥作用?它真的能和一些抽象的成员有关吗?别这么想。因此,首先把它抽象化的论点是不存在的。事实并非如此。
以动物的经典层次结构为例,在这里你有一个抽象类
|
3
11
我可以想到几个例子
|
4
10
从我读到的每一件事来看,似乎
它不仅不需要具体化,而且经过一些
more reading
我相信
|
5
7
我认为它应该已经被宣布为抽象的,但是一旦它被完成并发布,很难撤销而不会造成很多的痛苦。 “如果将非抽象类更改为声明为抽象类,则尝试创建该类新实例的现有二进制文件将在链接时抛出InstantiationError,或者(如果使用反射方法)在运行时抛出InstantiationException;因此,不建议对广泛分布的类进行这种更改。”." |
6
5
有时您需要一个没有自己状态的普通对象。虽然这些物体乍一看似乎毫无用处,但它们仍然有效用,因为每一个都有不同的用途。 身份 . TNIS在一些场景中很有用,其中最重要的是锁定:您希望协调两个线程。在爪哇中,使用一个被用作锁的对象来实现这一点。对象不需要任何状态,它的存在足以使它成为一个锁:
在这个例子中,我们使用一个锁来防止两个线程同时执行
如果对象是抽象的,我们需要一个锁,那么我们就必须在不添加任何方法或字段的情况下对它进行子类化,这样我们就可以实例化锁。 想一想,这里有一个双重问题:假设对象是抽象的,它会定义任何抽象方法吗?我想答案是 不 . 在这种情况下,将类定义为抽象类没有多大价值。 |
7
5
我不明白为什么大多数人似乎都相信创建一个完全功能类,它以一种使用完全抽象的方式实现它的所有方法是一个好主意。
useableobject继承自抽象对象,并且可以实现它,它不添加任何功能,它存在的唯一原因是允许访问对象公开的方法。
|
8
2
在我看来,这里有一个简单的实用性问题。将类抽象化会剥夺程序员做某事的能力,即实例化它。对于一个抽象类,你不能做任何你不能做的事情。(好吧,您可以在其中声明抽象函数,但在本例中,我们不需要有抽象函数。)因此,通过使其具体化,您可以使其更灵活。 当然,如果通过使其具体化而造成一些积极的伤害,那么“灵活性”将是一个缺点。但我想不出任何使对象可实例化的主动伤害。(是否“可实例化”一词?不管怎样),我们可以讨论某人对原始对象实例的任何给定使用是否是一个好主意。但即使你能说服我,我所见过的每一个原始对象实例的使用都是一个坏主意,那仍然不能证明那里可能没有好的用途。所以,如果它不伤害任何东西,而且它可能会有帮助,即使我们现在不能想到它实际上会有帮助的方法,为什么要禁止它呢? |
9
1
我怀疑设计者不知道未来人们使用对象的方式,因此不想通过强制程序员在不必要的地方创建一个额外的类来限制他们,例如对于互斥锁、键等。 |
10
1
我认为迄今为止所有的答案都忘记了Java 1是什么样的。在Java 1中,你不能制作一个匿名类,所以如果你只是为了某个目的而需要一个对象(同步或空占位符),那么你就必须为此声明一个类,然后一堆代码就有了这些额外的类。更直接地向前,只允许对象的直接实例化。 当然,如果你现在在设计Java,你可能会说每个人都应该这样做:
但这不是1.0中的一个选项。 |
11
0
它还意味着它可以在数组中实例化。在1.5天前,这将允许您拥有通用的数据结构。在某些平台上仍然是这样(我在考虑J2ME,但我不确定) |
12
-4
对象需要具体化的原因。
尽管已经替换了两个区域,但仍然需要一个具体的父类来向每个Java类提供这些特性。 对象类用于反射,因此代码可以对不确定类型的实例调用方法,即“object.class.getDeclaredMethods()”。如果对象是抽象的,那么想要参与的代码必须实现所有抽象方法,然后客户机代码才能对其使用反射。 据孙说, An abstract class is a class that is declared abstractâit may or may not include abstract methods. Abstract classes cannot be instantiated, but they can be subclassed. 这也意味着您不能调用方法或访问抽象类的公共字段。 抽象根类示例:
AbstractBaseClass的一个子类:
这不会编译,因为在构造函数中引用“this”是无效的,除非它调用同一类中的另一个构造函数。如果我将其更改为:
但这只起作用,因为ReflectedClass有一个父级(“Object”),它是1)Concrete,2)有一个字段来存储其子级的类型。 反射的一个更典型的例子是在非静态成员函数中:
除非将字段“clazz”更改为静态,否则将失败。对于对象的类字段,这不起作用,因为它应该是特定于实例的。对象具有静态类字段是没有意义的。 现在,我确实尝试了下面的更改,它是有效的,但有点误导。它仍然需要扩展基类才能工作。
Java5之前的泛型(比如数组)是不可能的。
在接收到实际对象之前,需要构造实例作为占位符。 |
13
-6
我怀疑简短的答案是,集合类在Java泛型之前的几天内丢失了类型信息。如果集合不是泛型的,那么它必须返回一个具体的对象(并且在运行时向下强制转换为以前的任何类型)。 因为将一个具体的类变为抽象类会破坏二进制兼容性(如上面提到的那样),所以保留了具体的对象类。我想指出的是,在任何情况下,它都不是为实现同步而创建的;虚拟类也可以工作。 设计缺陷从一开始就不包括泛型。很多设计批评都是针对这个决定及其后果的。[哦,还有数组子类型规则。] |
14
-9
它不是抽象的,因为每当我们创建一个新的类时,它会扩展对象类,如果它是抽象的,那么您需要实现对象类的所有方法,这是开销…该类中已经实现了方法… |
Schadre · C-plus编码错误 2 年前 |
Nithin K · 即使类属性的类型正确,也会获取异常 2 年前 |
amirreza870 · Python OOP-更改类文本 2 年前 |
A_K · 使用cat或打印方法打印部分内容的子集闭包 2 年前 |
Mo Fatah · 如何使用Python类打印数独板? 2 年前 |