2

我注意到它DrawableGameComponent可以用于“实例类”

DrawableGameComponent包含一些“覆盖”,例如DrawLoadContentUpdate...看看下面的代码:

这是 Game1 的类:

 public class Game1 : Microsoft.Xna.Framework.Game
    {

        public Game1()
        {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Contenttt";
        graphics.PreferredBackBufferWidth = GAME_WIDTH;
        graphics.PreferredBackBufferHeight = GAME_HEIGHT;
        }
     }

我另一堂课的代码:

public class Bullet: DrawableGameComponent //based by DrawableGameComponent
{
    public Bullet(Game1 game): base(game) //set argument for draablegamecomponent

    {
        //do something
    }
}

可绘制游戏组件:

public DrawableGameComponent(游戏游戏

参数说明:

游戏 类型:游戏 游戏组件应附加到的游戏。**

如您所见,参数 ofDrawableGameComponent是一个类 Microsoft.Xna.Framework.Game。然后我们用我们的Game1类填充它。

这是我的其他类的代码,将在我的 World Game1 中影响 DrawableGameComponent 的覆盖

 protected override void Initialize()
        {
            base.Initialize();            
        }
        protected override void LoadContent()
        {             

        }

        protected override void UnloadContent()
        {
        }

问题是:为什么我们可以在我自己的班级上使用他们的“覆盖”?为什么这会影响game1世界?

然而,在 c# 中,“base”语句就像

公共类项目符号:MyClass

我们不能让它基于“实例”类。

但是对于DrawableGameComponent实例类,他们可以通过他们的参数进行设置,因此他们的“覆盖无效”将适用于我们之前放置的参数类。

如果你知道怎么做,请告诉我如何上课。

4

1 回答 1

2

听起来您可能不了解virtual方法的概念。方法的能力override是可用的,因为在基类中定义的方法被标记为virtual。基本上这些是模板方法设计模式的例子。virtualabstract方法允许它们的实现在子类中改变(或者在抽象类的情况下,完全延迟)。

public abstract class BaseClass
{
   public void TemplateMethod()
   {
      DoSomething();
      DoSomethingElse();
   }

   protected virtual void DoSomething()
   {
      // implementation that can be changed or extended
   }

   // no implementation; an implementation must be provided in the inheritor
   protected abstract void DoSomethingElse();
}

public sealed class SubClass : BaseClass
{
   protected override DoSomething()
   {
      // add extra implementation before
      base.DoSomething(); // optionally use base class' implementation
      // add extra implementation after
   }

   protected override DoSomethingElse()
   {
      // write an implementation, since one did not exist in the base
   }
}

然后您可以执行以下操作:

SubClass subClass = new SubClass();

// will call the new implementations of DoSomething and DoSomethingElse
subClass.TemplateMethod();

也可以看看:

于 2012-12-23T15:29:02.767 回答