¿Cómo es factible que este código sea válido?

¿Este código es válido? https://ethereum.stackexchange.com/a/8484/10138 ¡Simplemente no veo cómo Mortal (mortal), una instanciación del contrato Mortal con un parámetro, es posible cuando Mortal no toma parámetros !

Respuestas (2)

Puedo ver por qué estás confundido. La clave que debe saber aquí es que se typename(X) ve igual functionname(parametername)pero en realidad es una operación totalmente diferente con la que puede estar familiarizado, lanzar .

Para aquellos que no lo saben, la conversión se trata de cambiar el tipo de una variable, generalmente de un tipo más simple a un tipo más complejo que normalmente se hereda de ella. Por ejemplo, es posible que desee convertir un uint32 al tipo uint64, más grande pero aún compatible. Para hacer eso, antecede el nombre de la variable que desea convertir con el nombre del tipo al que desea convertirlo, y luego lo rodea con paréntesis como este:

uint64(mycurrentvariablewhichisauint32)

En el caso de su pregunta, estamos analizando específicamente una característica menos conocida del lenguaje Solidity: todos los contratos se heredan del tipo "dirección" y, por lo tanto, los tipos de dirección se pueden convertir en tipos de contrato .

Dada esta información, es fácil ver lo que sucede en el fragmento de código al que hace referencia. Como señala Badr, el fragmento asume que la dirección confusamente denominada "mortal" es la dirección de una copia ya instanciada de un contrato de tipo mortal (o técnicamente compatible con la interfaz mortal, ya que no tiene que ser exactamente mortal). solo tiene que incluir las firmas de función que incluye mortal, generalmente porque heredó de él). Sin embargo, para llamar realmente a una de las funciones mortales, debe decirle a la solidez que esta dirección en particular es un contrato de tipo mortal. Lo haces enviando la dirección al tipo mortal:

Mortal(theaddressofthecontractwhichisactuallyamortaltypecontract)

Esta no es una llamada al constructor de Mortal, que parecería new Mortal()y generaría su propia dirección nueva desde cero. ¿Tener sentido?

Entonces, básicamente, estamos bajando una dirección a mortal: ¿algo así como un Objectto String(en Java)?
¡Sí! Siempre siento que los términos upcasting y downcasting deberían invertirse, pero dado que va de una clase base a una clase derivada, de hecho sería un downcast.
@JeffColeman Tengo curiosidad por saber por qué cree que se debe invertir la terminología de upcasting y downcasting. Cuando veo "abajo", pienso en "nivel inferior", por lo que tiene sentido para mí, estás lanzando a algo más específico. La conversión ascendente es de nivel superior y, en general, siempre se garantizará que funcione (suponiendo que la interfaz se implemente correctamente), mientras que la conversión descendente requiere que conozca el tipo subyacente con anticipación.

te refieres a este fragmento de código:

function checkMortal(address mortal) {
    if (Mortal(mortal).owner() == 0) {
        // You know it is dead.
    } else {
        // You know it is alive.
    }
}

el Mortal(mortal) en este caso es una instanciación del contrato Mortal, es similar a

function checkMortal(address mortal) {

Mortal M=Mortal(mortal);
        if (M.owner() == 0) {
            // You know it is dead.
        } else {
            // You know it is alive.
        }
    }
Sí, pero ¿por qué se puede instanciar? No hay un constructor para Mortal con un parámetro, que se llama cuando se crea una instancia del contrato Mortal (con un parámetro). Puedo ver Mortal M=Mortal()que es válido, pero no Mortal M=Mortal(someParameter).
olvide la visión de POO, aquí el constructor es una función que se ejecuta una vez cuando se crea el contrato. entonces, cuando lo llama usando su dirección, significa que no está llamando a su constructor.
¿Qué significa POO? ¿Y ese patrón del que hablas tiene algún nombre ( Contract(Address))?
@JossieCalderon ese no es el código que está creando instancias. Lo que Badr quiere decir es que a la función se le ha pasado la dirección de una copia ya instanciada de mortal. El código Mortal(passedInAddress)simplemente convierte el tipo de dirección en un tipo "Mortal" para que se pueda llamar a una de sus funciones. Ahora que lo escribí, creo que probablemente merece una respuesta completamente separada, así que escribiré una.
Poo o OOP para programación orientada a objetos,