Modelo de sustitución¶
Al tener una clase de este estilo:
// Definición de una clase C1 con parámetros de constructor a y b
class C1(a: Int, b: Int) {
// Método m que recibe dos parámetros x e y y retorna un Int
def m(x: Int, y: Int): Int = {
// Cuerpo del método (implementación no especificada)
// ...
}
}
Por ejemplo, al crear una instancia y llamar a un método:
// Creación de una instancia de C1 con a=1 y b=3
val objC1 = new C1(1, 3)
/**
* Esto crea un objeto: C1(a / 1, b / 3)
* Donde 'a' se sustituye por 1 y 'b' por 3 en el contexto del objeto
*/
// Llamada al método m sobre el objeto objC1 con parámetros 5 y 6
val res = objC1.m(5, 6)
/*
* Esto se expande a: m(this/C1(a / 1, b / 3), x/5, y/6)
* Donde:
* - 'this' se refiere al objeto objC1 (C1 con a=1, b=3)
* - 'x' se sustituye por 5
* - 'y' se sustituye por 6
*/
En otras palabras, lo que se está diciendo es que cuando ejecutas un método dentro de una clase, se tiene implícitamente a this (de forma implícita) como un parámetro adicional que representa la instancia actual sobre la cual se invoca el método.
this es la forma en que la clase se da cuenta de que fue instanciada y puede acceder a sus propios atributos y métodos.
Tabla de resumen¶
| Concepto | Descripción | Ejemplo/Implementación |
|---|---|---|
| Modelo de sustitución | Proceso mental/formal de reemplazar identificadores por sus valores durante la evaluación de expresiones. | Sustituir a por 1 y b por 3 en new C1(1, 3). |
Parámetro implícito this |
Referencia automática a la instancia actual dentro de los métodos de instancia. | En objC1.m(5,6), this se refiere a objC1. |
| Instanciación | Creación de un objeto concreto a partir de una clase, asignando valores a sus parámetros. | val objC1 = new C1(1, 3) crea una instancia con a=1, b=3. |
| Invocación de método | Llamada a un método sobre una instancia, pasando argumentos explícitos e implícitos. | objC1.m(5, 6) pasa 5 a x, 6 a y, e implícitamente objC1 a this. |
| Contexto de objeto | Estado interno de una instancia (valores de sus atributos) disponible a través de this. |
Dentro de m, this.a accedería a 1, this.b a 3 (si fueran accesibles). |
| Sustitución de parámetros | Reemplazo formal de parámetros formales por argumentos reales durante la ejecución. | En m(x, y), x se sustituye por 5, y por 6 al llamar m(5, 6). |
Comentarios adicionales¶
- El modelo de sustitución es fundamental para entender la semántica de la programación orientada a objetos: cómo se evalúan las llamadas a métodos y cómo se accede al estado del objeto.
- En Scala,
thises siempre implícito en los métodos de instancia (no estáticos). En métodos de clase (objeto compañero) no existethis. - La sustitución ocurre en múltiples niveles:
- Sustitución de parámetros del constructor al crear la instancia.
- Sustitución del parámetro implícito
thisal invocar un método. - Sustitución de parámetros del método al realizar la llamada.
- Este modelo explica por qué diferentes instancias de la misma clase pueden tener comportamientos diferentes: cada una tiene su propio
thiscon estado distinto. - En lenguajes funcionales puros, no existe el concepto de
this, pero en Scala (que combina paradigmas OO y funcional),thises esencial para la programación orientada a objetos. - La notación
objC1.m(5, 6)es azúcar sintáctica paraC1.m(objC1, 5, 6)en algunos lenguajes, donde el primer parámetro es explícitamente la instancia. - Comprender este modelo ayuda a depurar código, ya que permite rastrear mentalmente qué valores toman las variables en cada contexto de ejecución.