Here is your example translated to Nim using a method for "cry".
    
    
    type
      Animal* = ref object of RootObj
        weightOfAnimal*: int
    
    method cry(x: Animal) {.base.} =
      echo "Animal is crying..."
    
    type Dog* = ref object of Animal
        name*: string
    
    proc newDog*(sName: string = ""): Dog =
      new(result)
      result.name = sName
    
    method cry*(x: Dog) =
      procCall x.Animal.cry()
      echo "But Dog is barking..."
    
    let myAnimal1 = newDog()
    let myAnimal2 = Dog(name: "Médor")
    
    myAnimal1.cry
    myAnimal2.cry
    
    
    Run

Some explanations. I have used ref objects but could have used object instead. 
The only reason here is for convenience as I can use a proc "newDog" to create 
Dog objects.

There is no use for a proc "newAnimal" as the standard way to create Animal 
objects is sufficient (weight is initialized at 0 anyway). There is no real 
need for a proc "newDog" here but I have kept it for demonstration purpose.

To call the Animal "cry", you need to use procCall to bypass the dynamic 
binding. And you need a conversion to Animal of course. This way, you have full 
control over what you want to call in the class hierarchy.

To create a Dog object, we can use the "newDog" proc or we can simply provide 
the values of the fields to initialize.

For the name "Médor" for the dog, this is supposed to be a common dog name in 
French (never encountered a dog with this name though :-)). I don’t know the 
common dog name in English.

Hope this helps.

Reply via email to