有没有办法允许子类只覆盖-some- parent抽象方法

时间:2014-06-04 19:45:27

标签: c# inheritance

我理解标题可能没有意义,但下面应该解释我的困境。

所以我正在为我的MonoGame游戏制作用户界面。我有一个抽象类Clickable,其中包含一些在某些操作发生时调用的基本方法(以及为清晰起见而遗漏的一些其他内容):

abstract public class Clickable
{
    public abstract void OnClick(Vector2 pos, MouseButton button);

    public abstract void OnHover(Vector2 pos);

    public abstract void OnUnHover(Vector2 pos);

    public abstract void OnHold(Vector2 pos, MouseButton button);

    public abstract void OnRelease(Vector2 pos, MouseButton button);
}

我的ControlManager可以调用这些方法中的每一个,它会循环显示Clickable列表,以查看当前是否有任何上述方法适用。

然后我有一个继承自Clickable Control的类(再次被剥离):

abstract public class Control : Clickable
{
    public abstract void DrawBackground(SpriteBatch sb, GameTime gt);

    public abstract void DrawMiddleground(SpriteBatch sb, GameTime gt);

    public abstract void DrawForeground(SpriteBatch sb, GameTime gt);
}

因此,我的用户控件继承自此。我的问题是,为了拥有一个可编译的类,我必须覆盖所有这些抽象方法。

选择未完成的TextBox课程:

class TextBox : Control
{
    Typeable typeable;

    public TextBox(Vector2 position, int width, int height, string text, SpriteFont font, Control alignedTo, Dictionary<String, Texture2D> images) :
        base(position, width, height, alignedTo, images)
    {
        typeable = new Typeable(text, font, position);
    }

    public override void OnClick(Vector2 position, MouseButton button)
    {
        //Cursor functions will go here
    }

    public override void OnHold(Vector2 pos, MouseButton button)
    {

    }

    public override void OnHover(Vector2 pos)
    {

    }

    public override void OnRelease(Vector2 pos, MouseButton button)
    {

    }

    public override void OnUnHover(Vector2 pos)
    {

    }

    public override void DrawBackground(SpriteBatch sb, GameTime gt)
    {

    }

    public override void DrawMiddleground(SpriteBatch sb, GameTime gt)
    {
        //draw textbox background
    }

    public override void DrawForeground(SpriteBatch sb, GameTime gt)
    {
        //draw textbox text
    }
}

正如您所看到的,(评论所在的位置),我将只使用一些我不得不声明的方法。

有没有办法可以在我的抽象类中使用基本方法,而不是来覆盖,(只是有选项)?请注意,如果用户在控件上按住鼠标按钮,那么TextBox方法不会实现OnHold方法的类仍将由ControlManager调用。

3 个答案:

答案 0 :(得分:4)

最后,您的问题的答案是。对于要实例化的类(可实例化?),它必须覆盖每个抽象方法(或从实现它未实现的方法的类继承)。

要使此“可选”,只需将它们标记为virtual而不是abstract,并在基类中提供默认(空)实现。当您确实希望所有派生类实现该方法时,仅使用abstract

标记为virtual的方法必须具有实现,即使其为空:

public virtual void MyFunc()
{
}

有效。除非派生对象具有:

,否则将调用此方法
public override void MyFunc()
{
   //Some implementation
}

基本上,如果在C#中没有方法体某处,就无法进行方法声明。

答案 1 :(得分:3)

  

有没有办法可以在我的抽象类中使用基本方法而不必覆盖,(只是有选项)?

没有

  

请记住像TextBox这样不会实现OnHold方法的类,如果用户在控件上按住鼠标按钮,它仍将由ControlManager调用。

你想在你的基类中有太多的东西。并非所有控件都是可单击的,因此单击方法不应位于基类中。你似乎需要的是多重继承。

您可以使用接口执行此操作:

public class Button: Control, IClickable[, IScrollable[, I...]]
{
    public void OnClick(Vector2 position, MouseButton button)
    {
        // implements IClickable 
    }    
}

您不必在能够接收点击次数的控件之间重复很多代码,因为您还可以将点击处理方法放在IClickHandler中,并让它由基本事件处理程序实现。

答案 2 :(得分:1)

如果有些方法不是100%necassery,您可以将它们标记为virtual并提供基本实现,这甚至可能只是一个空方法。这样,你的驾驶室仍然会覆盖他们无法驾驶的地方,而他们不在的地方就可以使用“基础”实施。您绝对不能不实施abstract方法。