为什么我必须在抽象类中声明字段为“public”以从派生类访问它?

时间:2013-10-30 15:17:09

标签: c# oop

我有CPU和人类播放器所以我决定使用抽象类来定义常用功能。虽然他们的方法会有所不同,但两者的字段PieceToPlace都是相同的。 我不明白为什么它必须公开,我认为这就像常规继承。我不希望这个列表公开,但它不起作用。

abstract class Player
    {
        abstract public void Move(Piece p);
        abstract public void Place(Piece p);
        abstract public void TakeP(Piece p);

        List<Piece> piecesToPlace = new List<Piece>();

    }

4 个答案:

答案 0 :(得分:2)

它不必是公共的,但它必须是内部的,假设继承的类在同一名称空间,受保护或受内部保护。抽象类可以定义行为以及接口。因此,它仍然可能希望隐藏实现细节。

答案 1 :(得分:1)

班级成员的默认值为private,因此除非您为piecesToPlace指定任何其他访问修饰符,否则只能在Player班级内访问。

您无需使用public,使用protected可以继承类。

答案 2 :(得分:0)

这听起来像是在protected关键字之后,这将是:

  

访问仅限于从中派生的包含类或类型   包含类。

请点击此处了解详情:http://msdn.microsoft.com/en-us/library/ba0a1yw2(v=vs.110).aspx

答案 3 :(得分:0)

逻辑很简单,这取决于你的需要。如果您将其定义为public,例如:

    class Base
    {
        abstract public void Print();
    }

    class Derived: Base
    {
         public override void Print()
         {}
    }

    Main()
    {
         Base base = new Derived();
         //its possible
         base.Print();
    }

如果您将其定义为受保护,则无法访问base.Print(intellisense甚至不会显示此类方法存在)。由于这些方法只能从派生类中访问。