我理解标题可能没有意义,但下面应该解释我的困境。
所以我正在为我的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
调用。
答案 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
方法。