Herencia y sobrescritura de funciones: ¿Quién puede llamar a la función principal?

Quiero saber quién aún puede llamar a una función sobrescrita original en caso de herencia.

Supongamos que tengo la siguiente configuración:

contract A{
   address public owner;

   function A(){
       owner = msg.sender;
   }

   function doSomething(){
       // does something
   }
}

contract B is A{

   function doSomething(){
       require(msg.sender == owner);
       // do something like A but restrict this function execution to owner
       super.doSomething();
   }

}

Si implemento un contrato, B¿puede alguna cuenta externa que no sea el propietario seguir llamando doSomethingal contrato principal A? O podría algún contrato malicioso ejecutar lo siguiente:

contract EvilDoer{

    function doSomethingEvil{
         A contractB = A(addressOfdeployedB);

         contractB.doSomething();
    }

}

¿O las funciones sobrescritas están protegidas del uso externo?

EDITAR: Sobrecarga

Tal vez sería interesante y útil para mí y para otros explicar lo siguiente también: ¿Qué sucede en caso de sobrecarga de funciones , es decir, si la firma en la clase secundaria es diferente de su padre (por ejemplo, asumir function doSomething(uint256 someNumber){...}en contrato B)?

Respuestas (1)

Última pregunta primero: el concepto de sobrecarga se aplica a Solidity pero, en cuanto a otros lenguajes de programación que admiten funciones de sobrecarga, es decir, C++, no están relacionados entre sí de ninguna manera.

Las funciones con el mismo nombre pero diferentes parámetros se identifican con firmas diferentes, por lo que en realidad son funciones diferentes. Si ContractAdefine doSomething(), ContractBdefine doSomething(string myString)y ContractBhereda de ContractA, el Contrato B final tendrá dos funciones válidas que el usuario puede llamar: doSomething()y doSomething(string myString). La visibilidad también es parte de la firma, pero no se puede sobrecargar.

Pregunta principal ahora. Desde el exterior del contrato, no puede llamar a una función base que ha sido anulada . Esto se debe a que lo que está llamando desde el exterior es la implementación del contrato final, sin importar cómo defina la interfaz en el cliente para llamarlo.

Si tu defines

contract EvilDoer{
    function doSomethingEvil{
         A contractB = A(addressOfdeployedB);
         contractB.doSomething();
    }
}

Simplemente está definiendo otro puntero, y más restrictivo, hacia ContractBy para su implementación de doSomething(). Y su implementación es la última.

Pero hei, sé que la visibilidad de la función predeterminada es pública, ¿qué pasa si defino explícitamente la función base ContractAcomo external?

No mucho, porque no puede anular una función cambiando su firma extendida. Los parámetros de visibilidad y retorno son parte de la firma de la función extendida, por lo que el compilador arroja un error:

TypeError: Override changes extended function signature.

Si desea compilar, debe usar el mismo externalmodificador también en la ContractBfunción y, de nuevo, la última implementación de la función gana en cualquier caso.

Tenga en cuenta que cambiar la visibilidad o los parámetros de retorno tampoco se considera una sobrecarga, ya que las funciones se identifican mediante firmas, los contratos no pueden tener dos funciones con la misma firma y diferentes atributos extendidos.

Para obtener más información sobre temas de herencia, puede leer la documentación oficial , en particular, la información sobre la superpalabra clave y el gráfico de herencia final del contrato.