gpt4 book ai didi

java - 子类中的变量可见性

转载 作者:行者123 更新时间:2023-11-30 09:52:46 24 4
gpt4 key购买 nike

这是一个非常简单的问题,我为如此菜鸟而道歉:/

我是 Java 新手。我在市场上有一个运行良好的游戏,但代码都是垃圾。基本上,我写它就像写 JavaScript 一样。我正在尝试了解有关面向对象编程的更多信息。因此,在我的新游戏中,我一直在创建从自定义类扩展的对象。例如(这实际上不是我正在做的):

public class Color{
public final int STROKE_WIDTH = 3;

public Color(){}
}


public class Orange extends Color{
public int alpha = 30;

public Orange(){
super();
}
}

现在,假设在我的游戏主线程中,我实例化了许多颜色(橙色、红色、紫色)并将它们存储在 ArrayList<Color> 中.我在游戏的另一点遍历此列表,我想访问 Color的阿尔法。我的问题是,因为它们都包含在父类(super class)中,所以我不能只说 colorObj.alpha ,但我确实可以访问 colorObj.STROKE_WIDTH .同样,我将无法访问 Orange 类中的任何方法。

一定有办法做到这一点,我是新手。我不希望有人坐在这里打字解释..我不想浪费你的时间。但是,如果有人可以粘贴一些初学者教程的链接或可以帮助我解决此问题的内容,我将不胜感激!

最佳答案

I iterate through this list at another point in the game, and I want to access the Color's alpha. My problem is, since they're all wrapped into the superclass, I can't just say colorObj.alpha

如果您所有的实际颜色都有 alpha,则将其放入 Color 类中。它应该包含所有颜色共有的属性和行为。

旁注:面向对象编程的要点之一是封装。公共(public)数据成员公开您的类的内部表示。通常,您将该表示隐藏在访问器 方法后面,例如:

class Color {
private int alpha;
public int getAlpha() { return alpha; }
}

现在没有人知道你的代表;没有人可以将 alpha 更改为对颜色没有意义的值,您可以将其设置为只读或只写,您甚至可以将其更改为计算值并且使用它的任何客户端都不会受到影响。

事实上,OOP 中的一个“最佳实践”是将此发挥到极致并针对接口(interface)而非类进行编程。您将为 Colors 定义一个接口(interface),它没有数据成员,实际上无法实例化。它代表 Colors 将遵守的契约(Contract),仅此而已。例如:

interface Color {
int getR();
int getG();
int getB();
int getA();
}

class Red implements Color {
...

当然,这对于颜色之类的东西来说有点矫枉过正。我知道这是一个人为的例子,但是 Colors 没有不同的行为,只有不同的,所以与其拥有 Red、Orange 等类,不如拥有实例代表每个颜色的颜色类。

Similarly, I wouldn't be able to access any methods in the Orange class.

没错。但想法是处理颜色的代码并不需要知道它们是什么实际颜色。这就是多态的力量。如果需要一些特殊情况处理,您可以将颜色“向下转换”为特定子类型,但这样做的需要通常是设计草率的表现。

关于java - 子类中的变量可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4141636/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com