2016-09-23 3 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 ошибку.

Причина, по которой я хочу это сделать, состоит в том, что мой базовый класс имеет значение, которое я не хочу забывать реализовать в своем дочернем классе. Например, если я делаю кучу врагов для игры, а класс Enemy имеет модификатор скорости, я не хочу забыть включить, что во всех методах детей:

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 
    } 
} 

Хотя ему на самом деле не для движения. Это упрощение. Базовый класс содержит модификаторы возможностей, где класс children - это уникальные способности, которые используют модификаторы.

Как я могу структурировать свой код таким образом, чтобы ребенок должен был вызвать определенный родительский метод где-то в коде?

+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

Это мой плохой ... мой пример был слишком прост. Это не сработает для моей более сложной реальной ситуации. Это на самом деле «модификатор возможностей» в базовом классе, где класс child обладает совершенно уникальными способностями, которые используют этот модификатор. – Evorlor

+0

@Evorlor, тогда вы должны закрыть этот вопрос (либо удалить его, либо принять ответ), и задать еще один более подробный вопрос. – Dialecticus

Смежные вопросы