繁体   English   中英

C#类继承

[英]C# Class Inheritance

问候。 我有以下课程:

public class Ship
{
    public enum ValidShips
    {
        Minesweeper,
        Cruiser,
        Destroyer,
        Submarine,
        AircraftCarrier
    }

    public enum ShipOrientation
    {
        North,
        East,
        South,
        West
    }

    public enum ShipStatus
    {
        Floating,
        Destroyed
    }

    public ValidShips shipType { get; set; }

    public ShipUnit[] shipUnit { get; set; }

    public ShipOrientation shipOrientation { get; set; }

    public ShipStatus shipStatus { get; set; }

    public Ship(ValidShips ShipType, int unitLength)
    {
        shipStatus = ShipStatus.Floating;

        shipType = ShipType;

        shipUnit = new ShipUnit[unitLength];

        for (int i = 0; i < unitLength; i++)
        {
            shipUnit[i] = new ShipUnit();
        }
    }
}

我想像这样继承此类:

public class ShipPlacementArray : Ship
{

}

这是有道理的。

我想知道的是如何删除基类的某些功能?

例如:

    public ShipUnit[] shipUnit { get; set; } // from base class

我希望它是:

    public ShipUnit[][] shipUnit { get; set; } // in the derived class

我的问题是如何实现完全隐藏基类shipUnit的代码?

否则,我将在派生类中最终获得两个shipUnit实现。

感谢您的时间。

ShipPlacementArray仅处理一艘船。 但是数组反映了可以放置船的方向。

我想知道的是如何删除基类的某些功能?

你不知道 这不是继承的重点。 继承的重点是继承基类功能- 所有这些功能-并添加/更改内容。 用于“是”关系,例如,“汽车就是车辆”。

我的问题是如何实现完全隐藏基类shipUnit的代码?

听起来您想让ShipPlacementArray成为多个Ship对象的包装或容器。 这似乎不应该使用继承的情况。

问自己一个问题:“ ShipPlacementArray是一种Ship吗?”

根据我的经验,每次我想从继承的类的类中删除一个属性时,我的类设计都是有缺陷的。 解决此问题的一种方法是创建一个没有ShipUnit属性的新基类,然后两次继承该基类,一次是针对具体的Ship类型,一次是针对具体的ShipPlacementArray类型。 在这两个子类中,您都可以根据需要实现ShipUnit。

您不能使基类的成员在派生类中消失。 在某些情况下,您可以使用派生类中隐藏成员上的new关键字来屏蔽隐藏基成员,但是用户始终可以将您的对象强制转换回基类(base)instance_of_derived并访问基班级的成员。

因此,例如,您可以在派生类中执行以下操作:

public new ShipUnit[][] shipUnit { get; set; }

但是我可以做:

((Ship)ShipPlacementArray_instance).shipUnit

这将引用原始的shipUnit。 因此,您可以“隐藏”成员,但不能禁用其功能或可访问性。

使用C#的修饰符,您可以从基类成员中隐藏继承的成员。 查看页面以供参考。

除了其他出色的答案之外,我想说的是,封装可能是更好的选择。 通常,我一开始常常以为我想从一个类继承,后来发现我真的想封装它。 您只需在私有字段中声明原始类的新实例即可。 然后,您可以创建公共属性和函数,这些公共属性和函数只需调用原始类,如下所示,从而使您可以很好地控制公开的内容。 这也是避免继承缺点的一种方法,例如增加了复杂性和无法执行多重继承(有充分的理由):

class SomeNew
{
  private SomeOld someOld = new SomeOld();//could have done this in constructor instead

  public DoSomething()
  {
    someOld.DoSomething();
  }
}

我不知道这只是一个人为的例子,还是一个实际的问题。 但是,我想说这种情况下的继承是不希望的。 您有Ship和ShipPlacementArray。 最后的“数组”听起来更像是数组数据类型。 因此,将其带走,就可以得到ShipPlacement。

在我看来,这听起来像是某个地点,所以也许它应该是Ship类的成员?

“从类继承继承好对象的方法”-如果您要从基类中寻找新的行为,那么无论如何似乎都不想继承,因为它们是不同的类型。 也许Ship和ShipPlacementArray应该继承一个公共接口,但是肯定不是从一个公共基类继承的。 无论您需要使用哪一个接口,都可以使用它-但在需要ShipUnit矩阵的地方,可以显式使用ShipPlacementArray类型。

您可以使用“新”运算符。

public new ShipUnit[][] shipUnit { get; set; } // in the derived class

您可以使用new关键字,如下所示:

public new ShipUnit[][] shipUnit { get; set; }

我不完全了解您要使用继承建模的内容,但是我确信这是错误的工具。 我认为聚合或合成是您所需要的。

您可以使用new关键字或在基类的声明上添加virtual,并在派生类上覆盖它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM