如果有的话,在面向对象的系统中,应该在哪里选择类的C结构呢?


9

C和最有可能的许多其他语言提供了struct用于创建结构(或类似方式的东西)的关键字。从类的简化角度来看,它们是(至少在C语言中),但是没有多态性,继承,方法等。

考虑一下具有C样式结构的面向对象(或多范式)语言。您会在课堂上从哪里选择他们?现在,我不认为它们将与OOP一起使用,因为类似乎替代了它们的用途,但是我想知道在某些情况下,在面向对象的程序中,在某些情况下它们是否比类更受青睐。有这种情况吗?


您使用哪种语言?您要出版什么?除Java外,大多数现代的OO语言都以一种或另一种方式支持属性。
凯文·克莱恩

Answers:


16

在某些书中,我已经看到了承载状态的对象和提供功能的对象之间的区别。确切的术语因来源而异。但总的来说,前者的特点是具有一堆字段和一堆简单的getter-setters对(可能还有一个构造函数)。

对于显式标记为“可序列化”的类,这些在Java中尤其常见。

如果您认为不需要直接隐藏成员(例如,在嵌套类型的情况下),那么我认为这种类作为结构最有意义。


1
Robert C Martin用Clean Code称它们为“数据传输对象” 。
2012年

5

在C中,没有类,因此struct捆绑数据的方法也没有。在C ++中,除了默认情况下继承和成员访问权限是而不是之外,其他功能与之struct相同。C#也有一种,但是我对C#的评论不够多。考虑到语言差异,Common Lisp具有这种形式,它尽可能地像C 一样工作,并且与Common Lisp Object System类不同。classpublicprivatestructdefstructstruct

但是,相关的数据包和真实的类之间存在概念上的区别,在C ++ struct中,该数据包经常用于一组数据,而class对于应该具有自己行为的对象则使用它。作为指导,我想说a class代表您可以说有用的话,例如类不变式,而a struct会更松散地与数据值结合,而实际上并不太依赖于其他值。


6
在C#中,a struct和a 之间的区别class更为明显-最大的问题是a struct是值类型,而a class是引用类型。struct如果内容大于16个字节左右,Microsoft建议不要使用a 。
Carson63000 2011年

0

从最基本的角度来看,结构和纯数据类(除了属性访问器之外没有任何功能)之间有什么区别?

其实只不过是内存占用而已。


0

接受的答案是好的。我只想补充...。

有时最好在类中放置一个方法。在其他时候,最好有一个外部函数,其中将struct / class作为参数传递(即使您正在执行OOP样式)。

何时在类中放置方法的示例:Rectangle.CaclulateArea()

何时在类外放置函数的示例:Canvas.Draw(Rectangle rect)

您可以将Draw()放置在Rectangle中,它将起作用。但是绘图是依赖于层的操作。您不会在服务器端上画图,而会在客户端上画图。Draw()甚至在服务器上也没有意义。但是,“ CalculateArea()”与层无关,并且是矩形的真实属性,因此最好将其包含为成员方法。


0

对我而言,最大的区别在于是否存在类不变式

或者换句话说:我可以在任何时间自由地将任何字段更改为任何值吗?如果是这样,那是一个结构。如果不是,那是一堂课。

结构的通常示例是2D点,只有X和Y成员,该点可以具有任何值,并且彼此完全独立。公众访问是可以接受的。

一个类的示例是指向字符数组的指针和长度字段的组合:长度取决于指针的值,因此它不应是结构。这些字段应该是私有的,访问应该通过setter和getter进行,以确保类不变。


0

1)网络struct:通过电线传输的结构。

更一般地和形式上,您需要成为POD,琐碎,标准布局或相关概念的任何类。有关这些概念的精彩讨论以及示例,请参见此答案(适用于C ++ 11)。

2)函子(尤其是谓词),您可以将其传递给类似的函数std::remove_if。否则放进去,类似/继承自类似std::binary_function的类。

3)元编程概念,其中可能仅包含public constexpr和/或typedef

编辑:注意:此答案适用于C ++类与结构。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.