Mi maestro dice que siempre que queramos agregar una nueva funcionalidad a una clase, debemos hacer una subclase e implementarla allí. ¿Es esta una buena práctica?

Tiene sentido tener herencia de clase, cuando hay al menos dos clases similares que comparten mucho en común: puede refactorizar los elementos comunes al colocarlos en una clase base.

Hacerlo en la otra dirección, comenzar con una jerarquía de clases es bastante popular, pero no tiene sentido y, especialmente, va en contra del sabor de un buen C ++

En su caso particular, no creo que el maestro realmente quiera decir que siempre debe hacer esto. Solo quiere que reutilices el código existente para LinkedList sin modificarlo. La manera simple de hacerlo es derivar una subclase de ella.

Por ejemplo, es posible que haya implementado una lista vinculada de barebones; podría obtener otra lista que admita la recuperación del tamaño. Más tarde, puede crear uno que mantenga el tamaño internamente para que sea O (1) para obtener el tamaño.

El punto parece ser reutilizar el código que ya escribió, sin cambiarlo. Esto puede suceder en situaciones del mundo real: supongamos que tengo un proyecto que utiliza una estructura de datos que escribí. El proyecto funciona bien y se han erradicado los errores. Ahora quiero reutilizar partes del código para otro módulo no relacionado en el mismo árbol fuente, pero tengo que extender la funcionalidad. Sería reacio a tocar el código fuente existente de una aplicación de trabajo estable sin una buena razón. Tampoco me gustaría copiar todo y modificarlo. En cambio, podría derivar clases de las existentes y ampliarlas.

A veces. Use una subclase cuando tenga dos cosas diferentes que tengan la relación “es un” con el padre. Por ejemplo, un supervisor es un emplotee y un subordinado es un empleado. Sin embargo, un empleado no es una dirección, pero un empleado sí tiene (al menos un empleado), por lo que la relación allí es membresía de clase o “tiene un”.

Si tiene una clase que no es un hermano con otra clase, puede ser más fácil de implementar como una clase. Sin embargo, una clase debe ser una idea o cosa concisa. No agregue los campos de una dirección directamente dentro de la clase de empleado, escriba una clase separada para la dirección y no la contenga dentro de la clase de empleado. Reutilice la clase de dirección cuando desee la dirección de una empresa.

Muchas de las clases que escribo se derivan de una clase en el marco que uso. Sin embargo, he escrito ambas clases que se mantuvieron solas, y recorté archivos de herederos que eran increíblemente tupidos (35 o 40 clases en una jerarquía que estaba principalmente en el segundo nivel, pero fue a 4 o 5 niveles de profundidad en un lugar. también tenía una de esas clases que tenía una variedad de punteros a la clase base).

Eso no me suena a reutilización.

La impresión depende del tipo de plantilla, por lo que al menos parte de la implementación debe estar en la clase que se va a imprimir o como funciones independientes que se pueden pasar a la función de impresión como lambdas.

Haría algo como esto (si ya has trabajado con lambdas):

void List::Print(std::function elemPrintFcn)

{

... for each element in the list

{

elemPrintFcn(elem);

}

}

Entonces puede llamarlo así (suponga que tiene una lista de enteros):

list.Print([](const int &x) { std::cout << x << std::endl; });

También puede hacer que la función de impresión del elemento devuelva una cadena para que se imprima en la función Lista :: Imprimir. Depende de usted, pero lo importante es que la persona que llama proporcione la función de impresión del elemento. De esta manera, puede imprimir el mismo tipo de diferentes maneras, por ejemplo.

struct S

{

int a;

int b;

int c;

};

list.Print([](const S &s) { std::cout << sa << std::endl; });

list.Print([](const S &s) { std::cout << sb << std::endl; });

list.Print([](const S &s) { std::cout << sc << std::endl; });

Este patrón también se usa mucho en la biblioteca estándar (por ejemplo, cómo puede proporcionar diferentes funciones de comparación a std :: sort para ordenar los mismos datos de diferentes maneras).

No lo es, pero está atrapado en él, por lo que es probable que tenga que completar cortésmente el curso tal como se lo enseñaron y aprender C ++ más tarde, o de forma paralela.

Incluso cuando las plantillas no están involucradas, las interfaces idiomáticas de la clase C ++ están compuestas de funciones no miembros definidas en el mismo espacio de nombres que la clase, implementadas en términos del conjunto mínimo de funciones miembro públicas (que deben ser suficientes para acceder a todos los atributos sobresalientes del clase).

Si su lista tiene miembros públicos, begin () y end () devuelven un par de iteradores (¡como debería!), Puede escribir una impresión no miembro (const List &) u operador no miembro << (ostream & , const List &) en términos de esas funciones miembro.

Este es solo un mal ejemplo de reutilización.
Reutilizar, en el paradigma OO (y LinkedList no es código OO) implicaría conocer los invariantes de la clase base, y reutilizar por herencia significaría que puede fortalecer ese invariante. Por ejemplo, un cuadrado es un rectángulo es un trapecio. Todos tienen cuatro lados rectos, con restricciones cada vez mayores.
Una LinkedList imprimible puede violar algunos invariantes en un sistema esotérico, como “debe funcionar en un FPGA” donde puede no haber una pantalla. Pero estoy de acuerdo con otros, este es un mal ejemplo, y ostream_iterators son lo que se necesita aquí

La mayoría de las cosas no son absolutas y el maestro sabe que están tratando de establecer algunas pautas. Cambiar el código significa la posibilidad de romperlo. Ampliar la clase es una apuesta mucho más segura en la mayoría de los escenarios.

Por otro lado, Google regularmente rompe la API de Android, no importa modificar las partes internas invisibles.

Lo que está bien o mal en muchas áreas de programación variará de un programador a otro. Siempre y cuando comprenda las razones por las cuales alguien elegiría extender la clase, usted sabe lo que debe hacer. Desarrollarás tus propias creencias con el paso del tiempo.

Depende

En la industria, cuando se trabaja en un entorno distribuido, por lo general, si el equipo propietario de la clase original tiene un bloqueo estricto en el código o si la clase original está siendo utilizada por muchos otros equipos que no se preocupan por mi mejora ‘, Crearía una clase “wrapper” con mi nueva funcionalidad y usaría mi nueva clase en todas partes en mi código.

Entonces, en esencia, se reduce a: Cuán ‘útil’ es para otros, tener la nueva funcionalidad en la clase original.

Hay muchas opiniones y situaciones, pero creo que una pauta inicial sería preguntar dónde se encuentra la clase a la que desea agregar funcionalidad. ¿Está en local dentro de su proyecto? O, ¿está en un marco utilizado por muchas personas o sistemas? A veces se ve obligado a hacerlo y otras veces la decisión no es tan corta y seca.

More Interesting

Si obtengo una licencia de bienes raíces y me represento comprando una casa para mí, ¿recibiría la comisión de mi agente comprador?

Estoy haciendo un sumador-sustractor completo en DLD. El problema es que los LED están encendidos, incluso si no doy entrada. ¿Cuál es el problema?

Este año completé mi graduación en ciencias de la computación e ingeniería y me uniré a una empresa de TI en el mes de diciembre, pero no sé cómo pasar mi tiempo en este momento, por lo que resulta fructífero cuando me uno a mi empresa. Quiero decir, ¿qué debo estudiar o qué valores debo perseguir para inculcarme?

Planeaba hacer psicología pero no tengo idea de todos los procedimientos. ¿Qué es algo de ayuda?

Cuando le digo a alguien que amo la música de jazz, ¿qué se espera que sepa sobre el jazz por parte de personas que lo entienden bien?

Tengo un puntaje académico bajo de menos del 60 por ciento, ¿afectará mi ubicación después de estudiar en Nicmar?

Tengo mi placa base reemplazada de LG. Ahora estoy de vuelta en KitKat, es decir, en Android. Cuando busco actualizaciones, dice que está actualizado. ¿Hay alguna forma de recuperar Lollipop sin flashear o rootear, ya que anulará mi garantía?

No puedo obtener la salida que quiero. ¿Cuál es el problema en este código?

Quiero importar prendas de China y suministro al por mayor en India. ¿Cuál es la mejor manera?

La gente me llama Shanmukham. Mis nombres son Phalani Bala Shanmukham. Mi apellido es Medavarapu. ¿Cuál es mi primer nombre y segundo nombre?