【问题标题】:How to call abstract class from non parent如何从非父类调用抽象类
【发布时间】:2016-05-30 08:18:08
【问题描述】:

我有一个名为“Player”的非抽象类,以及一个名为“Score”的抽象类,其子类是“Combination”。在 Combination 中,还有在其他子类中使用的抽象方法。

如何从非父方法“Player”调用我的抽象方法而不使它们成为静态的?

// This is the abstract method within Combination, 
// it uses the face values from rolled dice to calculate the score.

abstract public int CalculateScore(int[] faceValues);

//Array of 'Score's in Player

private Score[] scores = new Score[10];

【问题讨论】:

  • 你能提供更多关于播放器和组合类的信息吗? faceValues 是什么意思?

标签: c# abstract-class abstract


【解决方案1】:

你不能。这是访问修饰符,旨在缩小对类的访问范围。要在您的情况下使用它,我建议将可访问性从 abstract 更改为 Score 类的 public

【讨论】:

    【解决方案2】:

    如果我理解正确,您想通过访问scores 字段在派生类中实现CalculateScore

    简单的答案是,您不能按照您的设计方式。 private 修饰符确保只有您自己的类才能访问该字段。如果您希望派生类可以访问该字段,您必须在scores 字段上将您的修饰符更改为protected

    如果您不希望您的派生类直接访问scores,您必须实现至少具有protected 访问权限的方法,这些方法以定义的方式在基类上修改scores-字段.

    【讨论】:

      【解决方案3】:

      所以你的情况:

      • Player是普通班
      • Score 是一个抽象类
      • Combination 也是一个抽象类,它是Score 的子类。它包含一个抽象方法 CalculateScore,您想从 Player 类内部调用它。
      • Player 有一个 Scores 数组

      您可以检查 Score 数组中的元素是否属于 Combination 类型,然后进行转换。

      if(score[0] is Combination)
      {
          (score[0] as Combination).CalculateScore(/* arguments here */);
      }
      

      不过,您可能需要重新考虑课程的运作方式。恕我直言,玩家不应该是计算分数的人。也许使用ScoreCalculatorService 来处理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-09
        • 2016-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多