2016-09-23 51 views
-1

我有一个方法的基类。我想强制这个类的所有孩子在代码中的某个地方调用这个基础方法。如何强制孩子调用父母方法?

public class BaseClass 
{ 
    public void BaseMethod() 
    { 
     //Do something 
    } 
} 

public class ChildClass1 : BaseClass 
{ 
    public void ChildMethod() 
    { 
     BaseMethod(); 
    } 
} 

public class ChildClass2 : BaseClass 
{ 
    public void ChildMethod() 
    { 
     //Doesn't call BaseMethod(); 
    } 
} 

所以我想ChildClass1要被罚款,但我想ChildClass2抛出一个错误。

我想这样做的原因是因为我的基类有一个我不想忘记在我的子类中实现的值。例如,如果我提出一堆敌人的游戏,敌人类有一个速度调节剂,我不想忘记,包括在所有的孩子方法:

public class Enemy 
{ 
    public float x; 
    public float y; 

    private float speed; 

    public float GetSpeed() 
    { 
     return speed; 
    } 

    public void SetSpeed(float speed) 
    { 
     this.speed = speed; 
    } 
} 

public class Goomba : Enemy 
{ 
    public void Move() 
    { 
     x += 5 * GetSpeed(); 
    } 
} 

public class Turtle: Enemy 
{ 
    public void Jump() 
    { 
     y += 5; //This is wrong. I forgot to adjust for speed. 
     //y += 5 * GetSpeed(); This is what I want to force myself to do 
    } 
} 

虽然实际上并不是为了运动。这是过分简单化。基类包含能力修饰符,其中的子类是使用修饰符的独特能力。

我该如何构造我的代码,以便需要孩子在代码中的某处调用特定的父方法?

+1

你把它定义为一个接口 – Amit

+2

遗忘的东西是不是一个很好的理由来改变你的代码。请记住下次。你会用一些高科技安全系统来替换你的普通门吗,只是因为你忘了锁定它们一次吗? – Dialecticus

+0

你可以使用事件 - 但对我来说似乎很愚蠢。 – Hogan

回答

1

可以使用TemplateMethod设计模式

public class BaseClass 
{ 
    public void BaseMethod() 
    { 
      DoSomething(); 
      TemplateMethod(); 

    } 
    protected abstract void TemplateMethod();  
} 

所以,你让你的派生类实现模板方法,但客户端类调用BaseMethod方法。这迫使DoSomething()位执行,但允许派生类包含它们自己的逻辑。

所以一个简单的例子在敌人的情况下(obvs适应,以便它符合您的需求)。

public abstract class Enemy 
{ 
    public float x; 
    public float y; 

    private float speed; 

    public float GetSpeed() 
    { 
     return speed; 
    } 

    public void SetSpeed(float speed) 
    { 
     this.speed = speed; 
    } 

    public void Move() 
    { 
     x += GetMovementAmount() * GetSpeed(); 
    } 

    public abstract decimal GetMovementAmount(); 
} 

public class Goomba : Enemy 
{ 
    public void GetMovementAmount() 
    { 
     return 5; 
    } 
} 

public class Turtle: Enemy 
{ 
    public void GetMovementAmount() 
    { 
     return 6; 
    } 
} 
+0

这是一个真正的尝试来回答这个问题,但它可能更好地是一个评论或提示。你能编辑和添加/改进它吗? –

+0

是的。现在添加一个例子。 @FirstStep – gmn

+0

谢谢。但这对我不起作用。因为我想从另一种方法中调用方法,就像我上面的例子。 – Evorlor

0

创建一个新的班级能力。它将允许您控制运行时发生的情况,并且用户可以根据需要进行运行。

public class Ability 
{ 
    Action myAct { get; set; } 

    public Ability(Action inAct) 
    { 
     myAct = inAct; 
    } 

    public Run() 
    { 
    DoStuffBefore(); 
    myAct(); 
    DoStuffAfter(); 
    } 

} 
+0

要么我不明白,要么这不回答这个问题。 – Evorlor

+1

我想你正在问一个不同的问题。 – Hogan

+0

@Evorlor - 查看新的答案 – Hogan

0

你可以重新安排代码,以便改变位置仅在基类是可能的:

public class Enemy 
{ 
    public float x { get; private set; } 
    public float y { get; private set; } 

    private float speed; 

    public Move(float dx, float dy) 
    { 
     x += dx * speed; 
     y += dy * speed; 
    } 
} 
+0

这是我的不好...我的例子太简单了。这不适用于我更复杂的实际情况。它实际上是基类中的“能力修饰符”,其中子类具有完全独特的使用此修饰符的能力。 – Evorlor

+0

@Evorlor,那么你应该关闭这个问题(删除它或接受一个答案),并要求另一个更详细的问题。 – Dialecticus