![](/img/trans.png)
[英]Accessing Protected Variable Of An Instance Of A Class That Extends An Abstract Base Class?
[英]Setting an instance variable of a child class that extends an abstract class
我有一个名为Shape
的类,它是抽象的,还有一个名为Circle
的类,它扩展了Shape
Shape shapeCircle = new Circle();
我可以设置和获取shapeCircle的颜色很好,因为颜色获取器和设置器在Shape中,但是Circle的尺寸仅适用于Circle类(半径)。
如果Circle类具有一个实例变量private int radius
和一个名为getRadius()
的方法,如何获取/设置shapeCircle
的半径? 我尝试了shapeCircle.getRadius();
,但没有运气。
只有对象ShapeCircle可以访问Shape的方法。 shapeCircle是Shape类型,Circle中的方法不可见。
通过使用这个
Circle shapeCircle = new Circle();
您可以同时调用Circle和Shape方法。 以上情况仅利用Inheritance 。
编辑
但是,如果您添加public abstract int getDimension();
在Shape
类和Circle
类中实现getDimension()
方法
@Override
public int getDimension() {
return radius;
}
所有扩展Shape
类都需要实现getDimension()
方法。 但是每个子类都有其自己的维度。
您可以使用
Shape shapeCircle = new Circle();
shapeCircle.getDimension();
这同时利用了多态和抽象类 。
Shape shapeCircle = new Circle();
这里的引用是Shape,shape类没有定义半径变量。所以不能使用shapeCircle.getRadius();
要调用get / set radious方法,请像下面这样铸造shapecircle变量
Circle shapeCircle = (Circle)shapeCircle;
现在,您可以调用get / set radious方法。 请注意,类型转换代码应采用某种不同的方法来受益于多态。
编辑:
您应该将抽象类或接口设计为具有所有重要/通用的操作/方法,以帮助您编写多态代码。 例如:Radius字段特定于Circle类,但是考虑到您最终想要计算面积。 因此,您应该在抽象类中定义CalculateArea()方法,并让每个形状都实现此方法。这样您就可以实现多态。
Shape ShapeCicle = new Circle(Radius);
Float area = ShapeCircle.area();
要点不限于半径示例,请尝试以某种方式定义类,以便可以从多态中受益。
您必须使用instanceof
关键字在此处检查原始类型。 如果类型为Circle
,则可以键入cast并调用getRadius
方法。 就像是
if (shapeCircle instanceof Circle) {
Circle circle = (Circle)shapeCircle;
int radius = circle.getRadius();
}
那应该做。
“形状不是圆形” =圆形方法不适用于“形状”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.