Movatterモバイル変換


[0]ホーム

URL:


Wikipedia

Method overriding

(Redirected fromMethod overriding (programming))
Not to be confused withFunction overloading.

Method overriding, inobject-oriented programming, is a language feature that allows asubclass or child class to provide a specific implementation of amethod that is already provided by one of itssuperclasses or parent classes. In addition to providing data-driven algorithm-determined parameters across virtual network interfaces,[1] it also allows for a specific type ofpolymorphism (subtyping). The implementation in the subclass overrides (replaces) the implementation in the superclass by providing a method that has same name, sameparameters or signature, and same return type as the method in the parent class.[2] The version of a method that is executed will be determined by theobject that is used to invoke it. If an object of a parent class is used to invoke the method, then the version in the parent class will be executed, but if an object of the subclass is used to invoke the method, then the version in the child class will be executed.[3] This helps in preventing problems associated with differential relay analytics which would otherwise rely on a framework in which method overriding might be obviated.[4][5] Some languages allow aprogrammer to prevent a method from being overridden.

Illustration

Language-specific examples

edit

Ada

edit

Ada provides method overriding by default.To favor early error detection (e.g. a misspelling),it is possible to specify when a methodis expected to be actually overriding, or not. That will be checked by the compiler.

typeTisnewControlledwith......;procedureOp(Obj:inoutT;Data:inInteger);typeNTisnewTwithnull record;overriding-- overriding indicatorprocedureOp(Obj:inoutNT;Data:inInteger);overriding-- overriding indicatorprocedureOp(Obj:inoutNT;Data:inString);-- ^ compiler issues an error: subprogram "Op" is not overriding

C# does support method overriding, but only if explicitly requested using the modifiersoverride andvirtual orabstract.

 

abstractclassAnimal{publicstringName{get;set;}// MethodspublicvoidDrink();publicvirtualvoidEat();publicvoidGo();}classCat:Animal{publicnewstringName{get;set;}// MethodspublicvoidDrink();// Warning: hides inherited drink(). Use newpublicoverridevoidEat();// Overrides inherited eat().publicnewvoidGo();// Hides inherited go().}

When overriding one method with another, thesignatures of the two methods must be identical (and with same visibility). In C#,class methods,indexers,properties and events can all be overridden.

Non-virtual or static methods cannot be overridden. The overridden base method must bevirtual,abstract, oroverride.

In addition to the modifiers that are used for method overriding, C# allows thehiding of an inherited property or method. This is done using the same signature of a property or method but adding the modifiernew in front of it.[6]

In the above example, hiding causes the following:

Catcat=newCat();cat.Name=;// accesses Cat.Namecat.Eat();// calls Cat.Eat()cat.Go();// calls Cat.Go()((Animal)cat).Name=;// accesses Animal.Name!((Animal)cat).Eat();// calls Cat.Eat()!((Animal)cat).Go();// calls Animal.Go()!

C++

edit

C++ does not have the keywordsuper that a subclass can use in Java to invoke the superclass version of a method that it wants to override. Instead, the name of the parent or base class is used followed by thescope resolution operator. For example, the following code presents twoclasses, the base classRectangle, and the derived classBox.Box overrides theRectangle class'sPrint method, so as also to print its height.[7]

#include<iostream>//---------------------------------------------------------------------------classRectangle{public:Rectangle(doublel,doublew):length_(l),width_(w){}virtualvoidPrint()const;private:doublelength_;doublewidth_;};//---------------------------------------------------------------------------voidRectangle::Print()const{// Print method of base class.std::cout<<"Length = "<<length_<<"; Width = "<<width_;}//---------------------------------------------------------------------------classBox:publicRectangle{public:Box(doublel,doublew,doubleh):Rectangle(l,w),height_(h){}voidPrint()constoverride;private:doubleheight_;};//---------------------------------------------------------------------------// Print method of derived class.voidBox::Print()const{// Invoke parent Print method.Rectangle::Print();std::cout<<"; Height = "<<height_;}

The methodPrint in classBox, by invoking the parent version of methodPrint, is also able to output the privatevariableslength andwidth of the base class. Otherwise, these variables are inaccessible toBox.

The followingstatements willinstantiate objects of typeRectangle andBox, and call their respectivePrint methods:

intmain(intargc,char**argv){Rectanglerectangle(5.0,3.0);// Outputs: Length = 5.0; Width = 3.0rectangle.Print();Boxbox(6.0,5.0,4.0);// The pointer to the most overridden method in the vtable in on Box::print,// but this call does not illustrate overriding.box.Print();// This call illustrates overriding.// outputs: Length = 6.0; Width = 5.0; Height= 4.0static_cast<Rectangle&>(box).Print();}

InC++11, similar to Java, a method that is declaredfinal in the super class cannot be overridden; also, a method can be declaredoverride to make the compiler check that it overrides a method in the base class.

Delphi

edit

InDelphi, method overriding is done with the directiveoverride, but only if a method was marked with thedynamic orvirtual directives.

Theinherited reserved word must be called when you want to call super-class behavior

typeTRectangle=classprivateFLength:Double;FWidth:Double;publicpropertyLengthreadFLengthwriteFLength;propertyWidthreadFWidthwriteFWidth;procedurePrint;virtual;end;TBox=class(TRectangle)publicprocedurePrint;override;end;

Eiffel

edit

InEiffel,feature redefinition is analogous to method overriding in C++ and Java. Redefinition is one of three forms of feature adaptation classified asredeclaration. Redeclaration also coverseffecting, in which an implementation is provided for a feature which was deferred (abstract) in the parent class, andundefinition, in which a feature that was effective (concrete) in the parent becomes deferred again in the heir class. When a feature is redefined, the feature name is kept by the heir class, but properties of the feature such as its signature, contract (respecting restrictions forpreconditions andpostconditions), and/or implementation will be different in the heir. If the original feature in the parent class, called the heir feature'sprecursor, is effective, then the redefined feature in the heir will be effective. If the precursor is deferred, the feature in the heir will be deferred.[8]

The intent to redefine a feature, asmessage in the example below, must be explicitly declared in theinherit clause of the heir class.

classTHOUGHTfeaturemessage-- Display thought messagedoprint("I feel like I am diagonally parked in a parallel universe.%N")endendclassADVICEinheritTHOUGHTredefinemessageendfeaturemessage-- Precursordoprint("Warning: Dates in calendar are closer than they appear.%N")endend

In classADVICE the featuremessage is given an implementation that differs from that of its precursor in classTHOUGHT.

Consider a class which uses instances for bothTHOUGHT andADVICE:

classAPPLICATIONcreatemakefeaturemake-- Run application.do(create{THOUGHT}).message;(create{ADVICE}).messageendend

When instantiated, classAPPLICATION produces the following output:

I feel like I am diagonally parked in a parallel universe.Warning: Dates in calendar are closer than they appear.

Within a redefined feature, access to the feature's precursor can be gained by using the language keywordPrecursor. Assume the implementation of{ADVICE}.message is altered as follows:

message-- Precursordoprint("Warning: Dates in calendar are closer than they appear.%N")Precursorend

Invocation of the feature now includes the execution of{THOUGHT}.message, and produces the following output:

Warning: Dates in calendar are closer than they appear.I feel like I am diagonally parked in a parallel universe.

Java

edit

InJava, when a subclass contains a method with the same signature (name and parameter types) as a method in its superclass, then the subclass's method overrides that of the superclass. For example:

classThought{publicvoidmessage(){System.out.println("I feel like I am diagonally parked in a parallel universe.");}}publicclassAdviceextendsThought{@Override// @Override annotation in Java 5 is optional but helpful.publicvoidmessage(){System.out.println("Warning: Dates in calendar are closer than they appear.");}}

ClassThought represents the superclass and implements a method callmessage(). The subclass calledAdvice inherits every method that could be in theThought class. ClassAdvice overrides the methodmessage(), replacing its functionality fromThought.

Thoughtparking=newThought();parking.message();// Prints "I feel like I am diagonally parked in a parallel universe."Thoughtdates=newAdvice();// Polymorphismdates.message();// Prints "Warning: Dates in calendar are closer than they appear."

When a subclass contains a method that overrides a method of the superclass, then that (superclass's) overridden method can be explicitly invoked from within a subclass's method by using thekeywordsuper.[3] (It cannot be explicitly invoked from any method belongings to a class that is unrelated to the superclass.) Thesuper reference can be

publicclassAdviceextendsThought{@Overridepublicvoidmessage(){System.out.println("Warning: Dates in calendar are closer than they appear.");super.message();// Invoke parent's version of method.}

There are methods that a subclass cannot override. For example, in Java, a method that is declared final in the super class cannot be overridden. Methods that are declared private or static cannot be overridden either because they are implicitly final. It is also impossible for a class that is declared final to become a super class.[9]

Kotlin

edit

InKotlin we can simply override a function like this (note that the function must beopen):

funmain(){valp=Parent(5)valc=Child(6)p.myFun()c.myFun()}openclassParent(vala:Int){openfunmyFun()=println(a)}classChild(valb:Int):Parent(b){overridefunmyFun()=println("overrided method")}

Python

edit

InPython, when a subclass contains a method that overrides a method of the superclass, you can also call the superclass method by callingsuper(Subclass,self).method[10] instead ofself.method. Example:

classThought:def__init__(self)->None:print("I'm a new object of type Thought!")defmessage(self)->None:print("I feel like I am diagonally parked in a parallel universe.")classAdvice(Thought):def__init__(self)->None:super(Advice,self).__init__()defmessage(self)->None:print("Warning: Dates in calendar are closer than they appear")super(Advice,self).message()t=Thought()# "I'm a new object of type Thought!"t.message()# "I feel like I am diagonally parked in a parallel universe.a=Advice()# "I'm a new object of type Thought!"a.message()# "Warning: Dates in calendar are closer than they appear"# "I feel like I am diagonally parked in a parallel universe.# ------------------# Introspection:isinstance(t,Thought)# Trueisinstance(a,Advice)# Trueisinstance(a,Thought)# True

Ruby

edit

InRuby when a subclass contains a method that overrides a method of the superclass, you can also call the superclass method by calling super in that overridden method. You can use alias if you would like to keep the overridden method available outside of the overriding method as shown with 'super_message' below.

Example:

classThoughtdefmessageputs"I feel like I am diagonally parked in a parallel universe."endendclassAdvice<Thoughtalias:super_message:messagedefmessageputs"Warning: Dates in calendar are closer than they appear"superendend

Notes

edit
  1. ^Zhang, Jie (2015). "A novel P2P overridden API for open data communications in WWW".2015 IEEE International Conference on Consumer Electronics - Taiwan. pp. 156–157.doi:10.1109/ICCE-TW.2015.7216830.ISBN 978-1-4799-8745-0.S2CID 23295793.
  2. ^Flanagan 2002, p. 107
  3. ^abLewis & Loftus 2006, p.454
  4. ^Overbey, J (2011). "Differential precondition checking: A lightweight, reusable analysis for refactoring tools".2011 26th IEEE/ACM International Conference on Automated Software Engineering (ASE 2011). pp. 303–312.doi:10.1109/ASE.2011.6100067.ISBN 978-1-4577-1639-3.S2CID 5933208.
  5. ^Li, K (2014). "Residual investigation: Predictive and precise bug detection".ACM Transactions on Software Engineering and Methodology.24 (2).doi:10.1145/2656201.S2CID 47112802.
  6. ^Mössenböck, Hanspeter (2002-03-25)."Advanced C#: Overriding of Methods"(PDF). Institut für Systemsoftware, Johannes Kepler Universität Linz, Fachbereich Informatik. pp. 6–8. Retrieved2011-08-02.
  7. ^Malik 2006, p. 676
  8. ^Meyer 2009, page 572-575
  9. ^Deitel & Deitel 2001, p.474
  10. ^super().method in Python 3 - seehttps://docs.python.org/3/library/functions.html#superArchived 2018-10-26 at theWayback Machine

See also

edit

References

edit
  • Deitel, H. M & Deitel, P. J.(2001).Java How to Program (4th ed.). Upper Saddle River, NJ: Prentice Hall.
  • Lewis, J. & Loftus, W. (2008).Java: Software Solutions (6th ed.). Boston, MA: Pearson Addison Wesley.
  • Malik, D. S.(2006).C++ Programming: Program Design Including Data Structure. (3rd ed.). Washington, DC: Course Technology.
  • Flanagan, David.(2002).Java in a Nutshell.Retrieved fromhttp://oreilly.com/catalog/9780596002831/preview#preview
  • Meyer, Bertrand (2009).Touch of Class: Learning to Program Well with Objects and Contracts. Springer.

External links

edit

[8]ページ先頭

©2009-2025 Movatter.jp