An abstract method is declared in the base class but its implementation is left to the inheriting class.
Suppose you have an area() method in the Shape class, as shown here:
class Shape { //stored properties var length:Double = 0 var width :Double = 0 //improvision to make the class abstract private init() { length = 0 width = 0 } func perimeter() -> Double { return 2 * (length + width) } //calculate the area of a shape func area() -> Double {} }
The implementation of area() should be left to inheriting classes, as only specific shapes know how to calculate the area.
To improvise abstract methods, use the assert() function:
class Shape { //stored properties var length:Double = 0 var width:Double = 0 //improvision to make the class abstract private init() { length = 0 width = 0 } func perimeter() -> Double { return 2 * (length + width) } //improvision to make the method abstract func area() -> Double { assert(false, "This method must be overridden") } }
The assert() function takes two arguments: a condition and a message.
When the condition evaluates to false , the program stops execution and the message is displayed.
To implement the area() method in the Rectangle class:
class Rectangle: Shape { //override the init() initializer override init() { super.init() } //overload the init() initializer init(length:Double, width:Double) { super.init() self.length = length self.width = width } //override the area() function final override func area() -> Double { return self.length * self.width } }
area() method definition has two prefixes:
modifier | Description |
---|---|
final | indicates that subclasses of Rectangle are not allowed to override the implementation of area() |
override | indicates that you are overriding the implementation of the area () method in the base class (Shape , that is) |
You will now be able to use the area() method, as shown here:
class Shape { //stored properties var length:Double = 0 var width:Double = 0 //improvision to make the class abstract private init() { length = 0//w ww .ja va 2 s.co m width = 0 } func perimeter() -> Double { return 2 * (length + width) } //improvision to make the method abstract func area() -> Double { assert(false, "This method must be overridden") } } class Rectangle: Shape { //override the init() initializer override init() { super.init() } //overload the init() initializer init(length:Double, width:Double) { super.init() self.length = length self.width = width } //override the area() function final override func area() -> Double { return self.length * self.width } } rectangle.length = 5 rectangle.width = 6 print(rectangle.perimeter()) //22 print(rectangle.area()) //30