- From: Kyle Huey <me@kylehuey.com>
- Date: Mon, 24 Oct 2011 14:22:24 -0400
- To: Cameron McCormack <cam@mcc.id.au>
- Cc: public-script-coord@w3.org
- Message-ID: <CAP045Armb7847gHegVWQuAamgr-bKqM39EJ1rugiN+ObO2uAuA@mail.gmail.com>
On Mon, Oct 24, 2011 at 1:49 PM, Cameron McCormack <cam@mcc.id.au> wrote: > Hi Kyle. > > > On 10/10/11 7:20 AM, Kyle Huey wrote: > >> First, my apologies if this has been brought up before, I haven't been >> following this list in the past. >> > > I don't think it has. > > > I have been considering how to implement WebIDL's overloading behavior >> in Gecko. There are some parts of the spec that will make this behavior >> quite difficult to implement: >> >> 1. Allowing the overload resolution behavior to be specified on a >> per-interface basis will require a significant amount of implementation >> complexity for questionable benefit. Rather than disambiguation >> behavior for the case: >> >> interface A { >> // ... >> }; >> >> interface B { >> // ... >> }; >> >> interface C { >> void f(A? x); >> void f(B? x); >> }; >> >> being specified by interface C (and being arbitrarily complex!), I >> propose that in any ambiguity in the overloads be resolved with >> whichever method is declared first in the interface "winning". Specs >> can be written to deal with this limitation. >> > > Currently the order of overloaded operations on an interface doesn't have > any effect, so this would be the first. This isn't a huge problem, but it > does mean that we would need to define how the ordering works across > multiple "partial interfaces", since they are also currently considered > unordered. (Maybe we could just disallow having overloads spread across > partials?) > I was kind of hoping that this was already disallowed. Making it work sanely seems hard. So as far as I know, there aren't (yet) any specs that define custom > disambiguation behaviour. I believe the only situations where the spec says > things are distinguishable when they might not be is objects implementing > multiple interfaces and nullable interface types. I wonder if we can just > get rid of the second case altogether, so that the above interface would > need to be written as: > > > interface C { > void f(A? x); > void f(B x); > }; > > On the other hand, it's quite likely that APIs written using overloading > like in your quoted example will have the same behaviour if you consider the > null to be passed to either of the two overloads (and there is some spec > text in there to say that if the interface definition does not explicitly > define how to disambiguate in this case, that one is chosen arbitrarily), so > I wouldn't be opposed to two nullable interfaces types being considered > distinguishable and just selecting the first one. I don't have strong opinions here either way. 2. Allowing interfaces to be distinguishable solely based on interface > identity is problematic. Consider the following: > > interface A { > // ... > }; > > interface B : A { > // ... > }; > > interface C { > void f(A? x); > void f(B? x); > }; > > If one passes in an object implementing interface B to C::f, which > overload should be invoked? This is problematic for us from C++ too > where determining which overload to call depends on determining the most > derived class (which is completely doable, but slow and annoying). I > propose that we modify the definition of distinguishable interfaces to > be distinct interfaces where one interface does not lie on the > inheritance chain of the other. > Yeah, I don't think we have any need to support overloading of two > interfaces in the same inheritance chain. Let's disallow that. > > Cool. Thanks, - Kyle
Received on Monday, 24 October 2011 18:23:02 UTC