The Cobra Programming Language
How To
PrintHelloWorld
WriteBasicSyntax
UseProperties
MakeAnIfElseLadder
MakeABranchStatement
DeclareInits
MakeAClassHierarchy
UseNilAndNilableTypes
UseDynamicTyping
DeclareVariableNumberOfArgs
ReadAndWriteFiles
CheckInheritanceAndImplementation
ImplementIEnumerable1
ImplementIEnumerable2
IterateThroughRecursiveDataWithYield
MakeACollectionClass
AccessMySQL
"""
CheckInheritanceAndImplementation.cobra


To check if a value inherits a particular class, use the `inherits` operator
which gives a boolean value (true or false):

    isACar = vehicle inherits Car

To check if a value implements a particular interface, use the `implements`
operator:

    isComparable = x implements IComparable

If you use these in an `if` statement with a variable, you can treat the
variable as the given class or interface with no explicit typecasting:

    if vehicle inherits Car
        vehicle.drive
        carCrusher.crush(vehicle)
    else if vehicle inherits Plane
        vehicle.fly
        airplaneGraveyard.take(vehicle)

Of course, it would be nice if Car and Plane were derived from a common Vehicle
class with an `operate` method, but sometimes you don't have control over the
class hierarchy you are working with.

"""


class BankAccount

    var _balance as decimal

    def deposit(x as Object)
        if x inherits Money
            _balance += x.amount
        else if x inherits decimal
            _balance += x
        else if x inherits int
            _balance += x
        else
            throw FallThroughException(x)

    # ^ In a way this is a bad example. Since we have control over the code,
    # providing method overloads of `deposit` would make the BankAccount interface
    # more clear and the program run faster.

    def deposit2(x)  # dynamic typed arg
        if x inherits Money
            _balance += x.amount
        else
            _balance = _balance + x  # woops, += isn't implemented for dynamic yet

    get balance from var


class Money

    var _amount as decimal

    def init(amount as decimal)
        _amount = amount

    get amount from var


class Program

    def main is shared
        ba = BankAccount()
        ba.deposit(10)
        ba.deposit(Money(10))
        assert ba.balance == 20