Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>I've done once a similar app. with a earlier "C++" compiler that supported only single inheritance and no interfaces, at all.</p> <pre><code>// base class for all ninjas public class Ninja { // default constructor public Ninja() { ... } // default destructor public ~Ninja() { ... } } // class public class StarNinja: public Ninja { // default constructor public StarNinja() { ... } // default destructor public ~StarNinja() { ... } public void throwStars() { ... } } // class public class KatannaNinja: public Ninja { // default constructor public KatannaNinja() { ... } // default destructor public ~KatannaNinja() { ... } public void useKatanna() { ... } } // class public class InvisibleNinja: public Ninja { // default constructor public InvisibleNinja() { ... } // default destructor public ~InvisibleNinja() { ... } public void becomeVisible() { ... } public void becomeInvisible() { ... } } // class public class FlyNinja: public Ninja { // default constructor public FlyNinja() { ... } // default destructor public ~FlyNinja() { ... } public void fly() { ... } public void land() { ... } } // class public class InvincibleNinja: public Ninja { // default constructor public InvincibleNinja() { ... } // default destructor public ~InvincibleNinja() { ... } public void turnToStone() { ... } public void turnToHuman() { ... } } // class // --&gt; this doesn't need to have the same superclass, // --&gt; but, it helps public class SuperNinja: public Ninja { StarNinja* LeftArm; InvincibleNinja* RightArm; FlyNinja* LeftLeg; KatannaNinja* RightLeg; InvisibleNinja* Body; // default constructor public SuperNinja() { // -&gt; there is no rule to call composed classes, LeftArm = new StarNinja(); RightArm = new InvincibleNinja(); LeftLeg = new FlyNinja(); RightLeg = new KatannaNinja(); Body = new InvisibleNinja(); } // default destructor public ~SuperNinja() { // -&gt; there is no rule to call composed classes delete LeftArm(); delete RightArm(); delete LeftLeg(); delete RightLeg(); delete Body(); } // --&gt; add all public methods from peers, // --&gt; to main class public void throwStars() { LeftArm-&gt;throwStars(); } public void useKatanna() { RightLeg-&gt;useKatanna(); } public void becomeVisible() { Body-&gt;becomeVisible() } public void becomeInvisible() { Body-&gt;becomeInvisible() } public void fly() { LeftLeg-&gt;fly() } public void land() { LeftLeg-&gt;land() } public void turnToStone() { RightArm-&gt;turnToStone(); } public void turnToHuman() { RightArm-&gt;turnToHuman(); } } // class </code></pre> <p>Im afraid, that the most close example is the composition design pattern. In order, to become more similar to inheritance, I make a generic base class that all composite classes share, and I make a main class that will be the result of the multiple inheritance, that has a copy of all the public methods of the component classes.</p> <p>If you want to use interfaces, to enforce that main class have all important methods, then make an interface that matches each composing class, and implemented in the main class.</p> <pre><code>public interface INinja { public void NinjaScream() { ... } } // class public interface IStarNinja { void throwStars(); } // class public interface IKatannaNinja { void useKatanna(); } // class public interface IInvisibleNinja { void becomeVisible(); void becomeInvisible(); } // class public interface CFlyNinja { void fly(); void land(); } // class public interface IInvincibleNinja { void turnToStone() { ... } void turnToHuman() { ... } } // class // base class for all ninjas public class CNinja: public INinja { // default constructor public CNinja() { ... } // default destructor public ~CNinja() { ... } public void NinjaScream() { ... } } // class public class CStarNinja: public CNinja, INinja { // default constructor public CStarNinja() { ... } // default destructor public ~CStarNinja() { ... } public void NinjaScream() { ... } public void throwStars() { ... } } // class public class CKatannaNinja: public CNinja, IKatannaNinja { // default constructor public CKatannaNinja() { ... } // default destructor public ~CKatannaNinja() { ... } public void NinjaScream() { ... } public void useKatanna() { ... } } // class public class CInvisibleNinja: public CNinja, IInvisibleNinja { // default constructor public CInvisibleNinja() { ... } // default destructor public ~CInvisibleNinja() { ... } public void becomeVisible() { ... } public void becomeInvisible() { ... } } // class public class CFlyNinja: public CNinja, IFlyNinja { // default constructor public CFlyNinja() { ... } // default destructor public ~CFlyNinja() { ... } public void fly() { ... } public void land() { ... } } // class public class CInvincibleNinja: public CNinja, IInvincibleNinja { // default constructor public CInvincibleNinja() { ... } // default destructor public ~CInvincibleNinja() { ... } public void turnToStone() { ... } public void turnToHuman() { ... } } // class // --&gt; this doesn't need to have the same superclass, // --&gt; but, it helps public class CSuperNinja: public CNinja, IKatannaNinja, IInvisibleNinja, IFlyNinja, IInvincibleNinja { CStarNinja* LeftArm; CInvincibleNinja* RightArm; CFlyNinja* LeftLeg; CKatannaNinja* RightLeg; CInvisibleNinja* Body; // default constructor public CSuperNinja() { // -&gt; there is no rule to call composed classes LeftArm = new CStarNinja(); RightArm = new CInvincibleNinja(); LeftLeg = new CFlyNinja(); RightLeg = new CKatannaNinja(); Body = new CInvisibleNinja(); } // default destructor public ~SuperNinja() { // -&gt; there is no rule to call composed classes delete LeftArm(); delete RightArm(); delete LeftLeg(); delete RightLeg(); delete Body(); } // --&gt; add all public methods from peers, // --&gt; to main class public void throwStars() { LeftArm-&gt;throwStars(); } public void useKatanna() { RightLeg-&gt;useKatanna(); } public void becomeVisible() { Body-&gt;becomeVisible() } public void becomeInvisible() { Body-&gt;becomeInvisible() } public void fly() { LeftLeg-&gt;fly() } public void land() { LeftLeg-&gt;land() } public void turnToStone() { RightArm-&gt;turnToStone(); } public void turnToHuman() { RightArm-&gt;turnToHuman(); } } // class </code></pre> <p>I know this solution is complex, but, seems that there is not another way.</p> <p>Cheers.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload