我想创建一个有两个方法的类,没有别的目的,我可以创建两个继承这些方法的子类。这个类不能单独运行。这是一个糟糕的编程设计或习惯吗?
3 回答
甚至有些类什么都不做,除了让其他类从中派生。超类本身是否可以拥有有用的实例并不重要。只存在于其他类派生的类通常称为抽象类;某些语言(例如 C++)还具有语法功能,允许编译器在您尝试从抽象类创建对象时给出错误。因此,拥有这样的课程并不会那么糟糕。
除此之外,什么是“坏习惯”?如果设置使代码更容易理解,那么它就不错了。
当然,如果您打算派生的两个类真的没有任何共同点,而这两个方法只是“嘿,我注意到那个类中的 10 行代码与另一个类中的这 10 行代码相同” ,然后把它变成一个共同的超类可能会让人感到困惑,而不仅仅是帮助。类仍应具有某种形式的关系。如果只是共享一些随机出现的代码,那么独立函数可能是更好的选择。
基本上,查看类的名称。如果您的新超类的名称类似于“一些非常通用的名称,因为我不知道它是什么”,那么它可能不是“好的设计”。另一方面,如果您对超类有一个专有名称,并且派生类的名称仍然与超类具有“某种”关系,那么这可能不是一件坏事。
另一个“好”的东西的强烈暗示是当你开始使用指向超类的指针时,因为你不在乎你是在处理一个还是另一个子类。
这是一个好习惯,它可以更好地组织功能。另一个原因是你只要看一下继承树就知道它与两个函数类有关。它没有太大的危害。
- 一般来说,没有固有的好坏之分。这在很大程度上取决于具体情况。但是,一般来说,您应该始终尝试遵循面向对象的原则。例如,无论何时创建一个类,无论是抽象的还是具体的,该类都应该同时具有data和behavior。这条规则非常重要,它一直是面向对象的基础。一个没有数据的类,只是一堆方法(这是过程编程,不是 OO)。没有行为的类是一堆变量(同样是过程的,而不是 OO)。因此,将数据和行为结合在一起很重要。但是,它们之间应该有逻辑关系,而不是随意放在一起。例如,一个方法应该以某种方式访问数据。
当然,这个规则也有偏差。例如,您可能在静态类中只有一堆方法(如 Java 中的 Math 类),或者在接口中只有一堆常量。但是,它们是例外而不是规则。他们在那里,出于必要,为了方便。在严格的面向对象的意义上,它们不是真正的类。
所以,要始终以正确的原则为目标,只有在别无他法的情况下才会偏离,而且只能作为例外,而不是作为规则。
- 上一点是指如何构造一个类。对于设计类之间的关系,同样,应该遵循逻辑路径。仔细思考你正在处理的每个概念,看看每个概念作为一个类是否有意义,然后看看这些类之间的关系是什么。如果看起来你有三个可以在继承中组织的概念 - 两个派生自父级的类,就这样吧。如果父类有两个方法,没关系。即使它有一种方法,它仍然可以。只要它代表一个连贯的逻辑单元。