superponer - Preferencia de uso entre una estructura y una clase en lenguaje D
superponer graficas en r (2)
¿Cuándo debo definir un tipo como una estructura o como una clase?
Sé que struct son tipos de valor mientras que las clases son tipos de referencia. Así que me pregunto, por ejemplo, ¿debo definir una pila como una estructura o una clase?
Lea "D" iving en el lenguaje de programación D
En D obtienes estructuras y luego obtienes clases. Comparten muchas comodidades, pero tienen diferentes cartas: las estructuras son tipos de valor, mientras que las clases están diseñadas para el polimorfismo dinámico y se accede solo por referencia. De ese modo, confusiones, errores relacionados con el corte y comentarios a la // ¡No! ¡NO heredar! no existe. Cuando diseñas un tipo, decides por adelantado si será un valor monomórfico o una referencia polimórfica. El famoso C ++ permite definir tipos de género ambiguos, pero su uso es raro, propenso a errores y lo suficientemente objetable para justificar simplemente evitarlos por diseño.
Para su tipo de Stack
, probablemente sea mejor definir primero una interface
y luego las implementaciones de la misma (utilizando la class
) para no vincular una implementación particular de su tipo de Stack
a su interfaz.
Razón # 1 para elegir la estructura vs clase: las clases tienen herencia, las estructuras no. Si necesitas polimorfismo, debes usar clases.
Razón # 2: las estructuras son normalmente tipos de valor (aunque puede hacer que sean tipos de referencia si trabaja en ello). Las clases son siempre tipos de referencia. Por lo tanto, si desea un tipo de valor, elija una estructura. Si desea un tipo de referencia, es más fácil ir con una clase.
Razón # 3: Si tiene un tipo con muchos miembros de datos, entonces probablemente querrá un tipo de referencia (para evitar la copia costosa), en cuyo caso, probablemente elija una clase.
Razón # 4: Si quieres la destrucción determinista de tu tipo, entonces tendrá que ser una estructura en la pila. Nada en el montón de GC tiene destrucción determinista, y los destructores / finalizadores de cosas en el montón de GC nunca pueden ejecutarse. Si son recogidos por el GC, entonces se ejecutarán sus finalizadores, pero de lo contrario, no lo harán. Por lo tanto, si desea que su tipo se destruya automáticamente cuando sale del ámbito, debe usar una estructura y colocarla en la pila.
En cuanto a su caso particular, los contenedores normalmente deben ser tipos de referencia (copiar todos sus elementos cada vez que pase uno sería increíblemente caro), y una Stack
es un contenedor, por lo que querrá usar una clase a menos que quiere tomarse la molestia de convertirlo en una estructura con recuento de ref, que es, sin duda, más trabajo. Simplemente tiene la ventaja de garantizar que su destructor se ejecutará cuando ya no se use.
En una nota al margen, si crea un contenedor que es una clase, probablemente querrá que sea definitivo para que sus diversas funciones puedan integrarse (y no será virtual si esa clase no se deriva de nada). aparte de Object
y no son funciones que Object
tiene), lo que puede ser importante para algo como un contenedor donde el rendimiento definitivamente puede importar.