Lua abstract base class implementation for middleclass
lua-middleclass-abc is just an middleclass class.
To mark methods as abstract it must return self.abstractmethod
Method :set_abstract_methods(cls) set all abstract methods in abstract base class. You must mark one or more methods like abstract
Metod :check_abstract_methods(cls) check all methods of subclass. If some abstract methods not implemented ABC raise "Can't instantiate abstract class" error
localclass=require"middleclass"localABC=require"abc"-- Defines an abstract base classlocalAbstractClass=class("AbstractClass", ABC)
functionAbstractClass:initialize()
ABC.initialize(self)
self:set_abstract_methods(AbstractClass)
endfunctionAbstractClass:first_method()
returnself.abstractmethodendfunctionAbstractClass:second_method()
returnself.abstractmethodend-- Define class inheriting from our abstract classlocalCorrectConcreteClass=class("CorrectConcreteClass", AbstractClass)
functionCorrectConcreteClass:initialize()
AbstractClass.initialize(self)
self:check_abstract_methods(CorrectConcreteClass)
endfunctionCorrectConcreteClass:first_method()
print("I'm correct first method!")
endfunctionCorrectConcreteClass:second_method()
print("I'm correct second method!")
end-- Define class inheriting from our abstract class without all methods implementationlocalIncorrectConcreteClass=class("IncorrectConcreteClass", AbstractClass)
functionIncorrectConcreteClass:initialize()
-- call superclass constructorAbstractClass.initialize(self)
-- check that all abstract methods is overriddenself:check_abstract_methods(IncorrectConcreteClass)
endfunctionIncorrectConcreteClass:first_method()
print("I'm correct first method!")
end-- Execution:localc=CorrectConcreteClass()
c:first_method()
c:second_method()
-- Returns:-- I'm correct first method of instance of class CorrectConcreteClass!-- I'm correct second method of instance of class CorrectConcreteClass!localic=IncorrectConcreteClass()
-- Raise error:-- Can't instantiate abstract class IncorrectConcreteClass with abstract methods [ second_method,]lua-middleclass-abc uses busted for testing