solidity 中新变量的接口与合约类型

Inferface vs contract type for new variable in solidity

假设一个合约C继承了一个接口IC c = new C()I c = new C() 有什么区别?在这两种情况下 c 都指向新部署的 C 实例,不是吗? (我在找here。)

更一般地说,I c;C c;有什么区别?

假设合约实现了一些扩展接口的方法,您也可以使用 C 类型变量调用这些(扩展的)方法。

pragma solidity ^0.8;

interface I {
    function foo() external;
}

contract C is I {
    function foo() override external {
        // implements the `foo()` function of the `I` interface
    }

    function otherFunction() external {
    }
}

contract Factory {
    function deploy() external {
        // the `I` type variable `i` can only invoke the `foo()` function
        I i = new C();
        i.foo();

        // the `C` type variable `c` can invoke the `otherFunction()` as well
        C c = new C();
        c.foo();
        c.otherFunction();
    }
}

如果契约和接口都定义了同一组方法(例如从示例中删除 otherFunction()),那么两个片段 - I i = new C();C c = new C(); - 有效地具有相同的功能。