Другой модификатор для методов называется abstract. Он позволяет объявить метод, который не реализуется в том же классе, а в классе, который наследует от того, в котором такой метод объявлен. Это дает гарантию, что все подклассы будут иметь подобный метод, хотя реализация может быть у всех разная.
Класс, содержащий абстрактные методы тоже должен быть абстрактным, чтобы не было попыток создания его экземпляра.
Разработка абстрактных методов должна быть помечена модификатором override. Свойства тоже могут быть абстрактными.
Virtual Methods
A virtual method allows to define default implementations to abstract classes and allows to derived classes to override its behavior, this is different than hiding methods.
publicabstractclassCaller:GLib.Object {publicabstractstring name { get; protectedset; }publicabstractvoidupdate (string new_name);publicvirtualboolreset () { name ="No Name";returntrue; }}publicclassContactCV:Caller{publicoverridestring name { get; protectedset; }publicoverridevoidupdate (string new_name) { name ="ContactCV - "+ new_name; }publicoverrideboolreset () { name ="ContactCV-Name";stdout.printf ("CotactCV.reset () implementation!\n");returntrue; }}publicclassContact:Caller {publicoverridestring name { get; protectedset; }publicoverridevoidupdate (string new_name) { name ="Contact - "+ new_name; }publicstaticvoidmain () {var c =newContact ();c.update ("John Strauss");stdout.printf(@"Name: $(c.name)\n");c.reset ();stdout.printf(@"Reset Name: $(c.name)\n");var cv =newContactCV ();cv.update ("Xochitl Calva");stdout.printf(@"Name: $(cv.name)\n");cv.reset ();stdout.printf(@"Reset Name: $(cv.name)\n");stdout.printf("END\n"); }}
As you can see in the above example, Caller is an abstract class defining both an abstract property and a method, but adds a virtual method which can be overridden by derived classes. Contact class implements abstract methods and properties of Caller, while using the default implementation for reset() by avoiding to define a new one. ContactCV class implements all abstract definitions on Caller, but overrides reset() so as to define its own implementation.