I have the following classes:
public class BaseRepository { public virtual void Delete(int id) { Console.WriteLine("Delete by id in BaseRepository"); } } public class EFRepository: BaseRepository { public override void Delete(int id) { Console.WriteLine("Delete by Id in EFRepository"); } public void Delete(object entity) { Console.WriteLine("Delete by entity in EFRepository"); } }
Then I use it like:
var repository = new EFRepository(); int id = 1; repository.Delete(id);
Why in that case only EFRepository.Delete(object entity)
will call?
Overloading allows several function definitions for the same name, distinguished primarily through different argument types; it is typically resolved at compile-time. Inheritance allows subclasses to define more special versions of the same function; it is typically resolved at run-time.
Yes of course, overloading in inheritance class is possible in Java. Java compiler detect that add method has multiple implementations. so according to the parameter java compiler will determines which method has to be executed. class Parent { public void add(int a) { System.
Inheritance enable us to define a class that takes all the functionality from parent class and allows us to add more. Method overriding occurs simply defining in the child class a method with the same name of a method in the parent class .
Overloading is adding a different method with same name as existing one, that differs in input parameters and return type. It has nothing to do with inheritance.
Basically, the way method invocation works in C# is that the compiler looks at the most derived class first, and sees whether any newly declared methods (not including overrides) are applicable for the arguments for the call. If there's at least one applicable method, overload resolution works out which is the best one. If there isn't, it tries the base class, and so on.
I agree this is surprising - it's an attempt to counter the "brittle base class" issue, but I would personally prefer that any overridden methods were included in the candidate set.
Method invocation is described in section 7.6.5.1 of the C# 5 specification. The relevant parts here is:
- The set of candidate methods is reduced to contain only methods from the most derived types: For each method
C.F
in the set, whereC
is the type in which the methodF
is declared, all methods declared in a base type ofC
are removed from the set. Furthermore, ifC
is a class type other than object, all methods declared in an interface type are removed from the set. (This latter rule only has affect when the method group was the result of a member lookup on a type parameter having an effective base class other than object and a non-empty effective interface set.)
And in the member lookup part of 7.4, override
methods are explicitly removed:
Members that include an
override
modifier are excluded from the set.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With