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