[英]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.