On Tuesday, 1 March 2022 at 08:40:12 UTC, Vijay Nayar wrote:
I've randomly encountered a strange error, and I cannot find any explanation for it in the official documentation of syntax.

Essentially, a class cannot call function overload in a super-class if the class itself contains an override. Is this a bug? Is this on purpose? Take a look at `B.otherThing()` below.

``` d
void main()
{
  abstract class A {
    // An abstract method for sub-classes
    abstract void doThing(string a, size_t b);
    // A convenience helper.
    void doThing(string a) {
      doThing(a, a.length);
    }
  }
        
  class B : A {
    // If this overload exists, something strange happens...
    override
    void doThing(string a, size_t b) {
    }
                
    void otherThing() {
      // Error: `B.doThing(string a, ulong b)`
      // is not callable using argument
      // types `(string)`
      doThing("hello");

      super.doThing("hello");  // OK
    }
  }
}
```

```d
void main()
{
  abstract class A {
    // An abstract method for sub-classes
    abstract void doThing(string a, size_t b);
    // A convenience helper.
    void doThing(string a) {
      doThing(a, a.length);
    }
  }
        
  class B : A {
    // If this overload exists, something strange happens...
    override
    void doThing(string a, size_t b) {
    }

alias doThing = typeof(super).doThing; //add super.doThing to overload set.
                
    void otherThing() {
      // Error: `B.doThing(string a, ulong b)`
      // is not callable using argument
      // types `(string)`
      doThing("hello");

      super.doThing("hello");  // OK
    }
  }
}
```

Reply via email to