Thank you kindly for this detailed response. Your directions bore
frution, and I now have cats that breed cats (and not dogs).
However I can't get rid of the following warning on compilation :

|...
| void mixGenetics(Cat mother,Cat father) {...}
|...

Warning: Beast.Beast.mixGenetics(Beast mother, Beast father) hidden by Cat is deprecated. Use 'alias Beast.mixGenetics mixGenetics;' to introduce base class overload set.

Well, I know every of those words, but I can't make sense out of
the sentence. Hidden function ? Alias function ?

I tried some variants, which yields errors :

|...
| override void mixGenetics(Cat mother,Cat father) {
|...

Error: function CatsAndDogs.Cat.mixGenetics does not override any function, did you mean to override 'Beast.Beast.mixGenetics'?

Why, yes, this is precisely what I'm trying to do, stupid
compiler.


|...(in class Cat)
|...
| void mixGenetics(Beast mother,Beast father) {
|   super.mixGenetics(mother,father);
|   this.pickiness = (mother.pickiness + father.pickiness) / 2 ;
| }
|...

Error: no property 'pickiness' for type 'Beast.Beast'

I'm not that surprised here, I tried this one just in case, but
this leads me to a part of your previous answer I did not quite
get :
You can cast Beasts back into Cats with cast(Cat) beast. Be sure to check for null - if beast is a dog, that cast will return null.

I do get the idea, but wasn't able to implement it, and I find
the online litterature to be quite terse on the topic of casting
user-defined types.
http://dlang.org/operatoroverloading#cast

Does that mean that I must define a cast operator in my classes ?

Thanks again.

-----------------------------------------------------------------------
For the record, I include below the code that works despite the
warning
-----------------------------------------------------------------------

module Beast;
import std.conv;

class Beast{
        string name;
        int generation;

        this(){}

        this(string s)  {
                name=s;
                generation=0;
        }

        //protected
        void mixGenetics(Beast mother, Beast father) {
                this.name=mother.name~father.name;
                this.generation=father.generation+1;
        }

        override
        string toString() {
                return "*"~this.classinfo.name~"* Name : "~this.name ~"; Gen. :
"~ to!string(this.generation);
        }
}

class Cat:Beast
{
        int pickiness;
        this(){};
        this(string name, int pickiness){
                super(name);
                this.pickiness=pickiness;
        }

        this(string name, string pickiness){
                super(name);
                this.pickiness=to!int(pickiness);
        }

        protected void mixGenetics(Cat mother,Cat father) {
                super.mixGenetics(mother,father);
                this.pickiness = (mother.pickiness + father.pickiness) / 2 ;
        }

        override string toString() {    return super.toString ~" ; Pick. :
"~to!string(this.pickiness);}

        Cat breed(Cat father){
                Cat kitten=new Cat();
                kitten.mixGenetics(this, father);
                return kitten;
        }
}

class Dog:Beast
{
        int fetchiness;

        this(){};

        this(string name, int fetch)    {
                super(name);
                fetchiness=fetch;
        }

        this(string name, string fetch){this(name, to!int(fetch));}

        override string toString() {    return super.toString ~" ; Fetch. :
"~to!string(this.fetchiness);}

        protected void mixGenetics(Dog mother,Dog father) {
                super.mixGenetics(mother,father);
                this.fetchiness = (mother.fetchiness + 2*father.fetchiness) / 3
;
        }

        Dog Breed(Dog father){
                Dog puppy=new Dog();
                puppy.mixGenetics(this, father);
                return puppy;
        }

}

---------------------- here be main ------
module Main;
import Beast;
import std.stdio;

void main(string[] args){
        string aName = (args.length>1)?args[1]:"default name";
        string aArg2 = (args.length>2)?args[2]:"default arg2";
        Cat rita = new Cat(aName,aArg2);
        writeln(rita.toString);
        Cat ringo = new Cat("Ringo", 8);
        writeln(ringo.toString);

        Cat Riton = rita.breed(ringo);
        writeln(Riton.toString);

        Dog dolly = new Dog("Dolly",20);
        Dog rocky=new Dog("Rocky",14);
        Dog snoopy=dolly.Breed(rocky);
        writeln(dolly.toString);
        writeln(rocky.toString);
        writeln(snoopy.toString);
}

---------------------- and finally a satisfactory output sample :
*Beast.Cat* Name : Rita; Gen. : 0 ; Pick. : 15
*Beast.Cat* Name : Ringo; Gen. : 0 ; Pick. : 8
*Beast.Cat* Name : RitaRingo; Gen. : 1 ; Pick. : 11
*Beast.Dog* Name : Dolly; Gen. : 0 ; Fetch. : 20
*Beast.Dog* Name : Rocky; Gen. : 0 ; Fetch. : 14
*Beast.Dog* Name : DollyRocky; Gen. : 1 ; Fetch. : 16

Reply via email to