【问题标题】:Proper constructor overloading using OOP principals?使用 OOP 原则正确重载构造函数?
【发布时间】:2012-12-01 20:01:54
【问题描述】:

我正在开发一款游戏,其中我将粒子效果作为一个单独的类

    public class Explosion 
    {
         private List<Particle> Particles; 
         private const int particle_Count = 100; 
         public Explosion(Vector2 location) { 
               Random random = new Random(); 
               Particles = new List<Particle>(particle_Count);
               for(int i = 0; i < particle_Count; i++)
                   Particles.add(new Particle(location, new Vector2(random.NextDouble() * i,
                       random.NextDouble() * i)); 
         }
    }

现在,我的游戏中需要有几种不同类型的爆炸,但它们的变化非常细微(实际上是一个 Vector2 对象之间的区别(它只是一个存储两个坐标和一些辅助函数的对象)不熟悉XNA的人))

我的问题是,因为 Random 只能在我进入构造函数后才能访问,我如何对这种爆炸进行变化?

我应该为每次爆炸创建一个新班级吗? (这似乎没有必要,因为爆炸之间的变化很小)

我是否应该重载该函数以为每个不同的爆炸获取一个单独的参数(可能是一个 int)?

我是否应该通过构造函数直接将 Vector2 传入(这对我来说似乎会破坏良好的 OOP 原则)

或者有没有其他方法可以解决这个问题,我只是没有看到。

任何帮助都将不胜感激,我喜欢第一次做正确的事情,这是我申请的重要组成部分。

谢谢。

【问题讨论】:

  • 看不到通过构造函数传递 Vector2 的问题,因为它只包含两个值属性 (x/y) 和一些辅助方法 - 所以本质上你只是将一些值包装在一个方便的辅助方法中班级。 (也只是看看你已经通过构造函数传递 Vector2 的类 def ......?!)
  • “我应该为每次爆炸创建一个新课程”是什么意思?每种类型的爆炸实际上有什么不同?
  • 我正在传递一个 Vector2,因为每次爆炸都需要一个位置作为起点,并且在整个应用程序中保持不变。
  • @Benjamin 很少,只是每个粒子的速度向量。我不能随机化,因为每次只有一个爆炸是唯一的,另外两个是预定义的。
  • 所以您不想要不同“类型”的爆炸,而是想要配置不同的爆炸?

标签: c# oop parameters xna overloading


【解决方案1】:

由于每个变体之间只有一个参数差异,最好的办法就是将另一个参数传递给构造函数(如您所述)。只需传递您需要的最少信息;如果你愿意,可以给它一个默认值,这样就不需要了:

public Explosion(Vector2 location, int velocity = 1) { 
}

如果它是一个复杂的对象,而不仅仅是一个 int,那么考虑制作某种辅助方法:

public class Explosion
    public Explosion(Vector2 location, Velocity velocity) { 
    }
}

public class Velocity {
    public static Velocity Get(int a, int b) {
        // construct the velocity as needed
    }
}

这样调用 Explosion 的构造函数就不必太麻烦了:

var explosion = new Explosion(vectorLocation, Velocity.Get(5, 10));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多