dart / co19 / 74ba459aecc908d5db91531f020a3f74e9aa1b4d / . / Language / Interfaces / Superinterfaces / Inheritance_and_Overriding / inheritance_t08.dart

// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | |

// for details. All rights reserved. Use of this source code is governed by a | |

// BSD-style license that can be found in the LICENSE file. | |

/// @assertion We define inherited(J, K) to be | |

/// the set of members m such that all of the following hold: | |

/// • m is accessible to K and | |

/// • A is a direct superinterface of J and either | |

/// – A declares a member m or | |

/// – m is a member of inherited(A, K). | |

/// • m is not overridden by J. | |

/// ... | |

/// Otherwise, if the static types T1,...,Tk of the members m1,...,mk are not | |

/// identical, then there must be a member mx such that Tx <: Ti, 1 ≤ x ≤ k for | |

/// all i ∈ 1..k, or a static type warning occurs. The member that is inherited | |

/// is mx, if it exists; otherwise: let numberOf P ositionals(f) denote the | |

/// number of positional parameters of a function f, and let numberOf | |

/// RequiredParams(f) denote the number of required parameters of a function f. | |

/// Furthermore, let s denote the set of all named parameters of the m1,...,mk. | |

/// Then let | |

/// h = max(numberOf Positionals(mi)), | |

/// r = min(numberOf RequiredParams(mi)), i ∈ 1..k. | |

/// Then I has a method named n, with r required parameters of type dynamic, | |

/// h positional parameters of type dynamic, named parameters s of type dynamic | |

/// and return type dynamic. | |

/// @description Checks that there's no static warning if non-abstract class | |

/// implements two interfaces with same named methods that have different named | |

/// formal parameters and defines method from its implicit interface. In this | |

/// case the implicit interface of non-abstract class has method with one | |

/// required parameter of type dynamic and a set of all named optional | |

/// parameters. | |

/// @author ngl@unipro.ru | |

abstract class SI1 { | |

void foo(var v, {int foo, int bar}); | |

} | |

abstract class SI2 { | |

void foo(var v, {int foo, int b4r}); | |

} | |

class I implements SI1, SI2 { | |

void foo(dynamic v, {dynamic foo, dynamic b4r, dynamic bar}) {} | |

} | |

main() { | |

I? i = null; | |

} |