Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >初始化子类中的超类变量(构造函数中需要)

初始化子类中的超类变量(构造函数中需要)
EN

Stack Overflow用户
提问于 2015-10-07 12:52:55
回答 6查看 3.9K关注 0票数 6

我正在编写一个简单的小行星克隆游戏,使用Swing显示图形。我有点喜欢德里克·巴纳斯的教程,但我决定自己扩展。

最初的想法是,游戏中的每一个图形元素(即小行星、飞船和子弹)都扩展了Polygon类。他们的构造函数看起来如下所示:

代码语言:javascript
代码运行次数:0
复制
public class SpaceShip extends Polygon {

    //x and y coordinates
    public static int[] polyXArray = {...};
    public static int[] polyYArray = {...};

    //other class variables
    {...}

    public SpaceShip() {

        super(polyXArray, polyYArray, polyXArray.length);
    }
}

其他图形元素也是一样的。

编辑:这里的关键元素是,这两个数组不存储对象的实际坐标,而是它们相对于中心的位置,其坐标是double-type类变量。因此,数组只描述对象的形状,而子类move()方法将影响中心的坐标。负责实际绘制的类将调用move()方法,然后应用仿射变换来移动和旋转形状(根据正确定义的角度参数)。我这样做是为了避免与处理double算法相关的精度问题。

现在,由于元素有许多“相等”变量(它们的中心坐标,为了用仿射变换将它们转换为中心坐标,它们的速度分量等等)和方法(getter和setter、move()方法等)我想让它们成为一个抽象类的扩展,比方说,GameShape,它包含了所有这些常见的方法和变量。现在,GameShape将直接扩展Polygon

代码语言:javascript
代码运行次数:0
复制
public abstract class GameShape extends Polygon {

        //x and y coordinates, still unassigned
        public static int[] polyXArray, polyYArray;

        //other class variables
        {...}

        public GameShape() {

            super(polyXArray, polyYArray, polyXArray.length);
        }
}

然后,当我定义不同的子类以绘制我需要的不同形状时,我想要将所需的值分配给polyXArraypolyYArray,但是我还没有找到一种方法。

我确实希望这些变量是静态的,因为它们是单个类的特定属性,而且我不希望每次实例化新对象时都将它们作为参数传递。

我的情况与这个问题中描述的情况非常相似,但建议的解决方案似乎不起作用,因为我需要构造函数中的那些变量。有什么办法可以克服这个问题吗?不管过程如何,我的主要目标是拥有一个与所有图形元素共同的超类,以避免数十行复制粘贴的代码。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-10-07 13:02:36

编辑:

正如VGR在评论中指出的那样,这将不会编译。因此,我们将不得不稍微修改实现,即我们将使用have关系而不是IS关系:)

首先,不要使聚数组字段静态。如果您这样做了,那么对于所有的子类来说,它们都是相同的,那么有什么意义呢?

其次,在这里使用模板方法设计模式。你的课会是这样的:

代码语言:javascript
代码运行次数:0
复制
public abstract class GameShape {

        //x and y coordinates, still unassigned
        public int[] polyXArray, polyYArray;

        private Polygon polygon;

        //other class variables
        {...}

        public GameShape() {
            instantiatePolyArrays();
            this.polygon = new Polygon(polyXArray, polyYArray, polyXArray.length);
        }

        protected abstract void instantiatePolyArrays();

        public final Polygon getPolygon(){
            return this.polygon;
        }
}

每个扩展类都必须重写此方法,并且可以为每个方法重写中的每个类实例化数组。

另外,还有一个关于is - with问题的词--在您的示例中,您展示的是一个IS关系,其中GameShape对象是一个Polygon,因此需要调用超级构造函数,并由此产生问题。在我的解决方案中,这被替换为一个HAS关系,其中GameShape对象内部有一个Polygon对象,并使用getPolygon()方法进行访问。这允许您有更多的灵活性:-)

票数 -1
EN

Stack Overflow用户

发布于 2015-10-07 13:05:53

您有一对数组,用于描述特定种类的游戏对象的形状。如果不同的游戏对象可以有不同的形状,那么它们都不能共享一个单独的数组,就像它们是所有游戏对象类的公共超类的静态属性一样。同一类型的不同对象可以共享相同的数组(假设这些数组不需要在每个对象的基础上进行修改),这可能对应于这些数组是具体游戏对象类的静态字段。但是,在这种情况下,如果您希望这些类的超类能够访问给定游戏对象的正确形状数据,那么必须告诉它这些形状数据是什么。

有两种主要的方法可以做到这一点:

  1. 可以将适当的形状数组传递给超类的构造函数。你说你不想这么做,但我不明白为什么。
  2. 您可以在子类应该覆盖的超类上定义访问器方法,以提供正确的形状数据(这称为模板方法模式)。
票数 2
EN

Stack Overflow用户

发布于 2015-10-07 13:08:26

数组字段不能是static,因为不同形状的坐标不同。另外,在特定的子类中不需要这些数组,因为它们已经在PolygonGameShape中了。

下面是我编写GameShape的方式(虽然我同意@Michael,您不需要同时将polyXArraypolyXArray.length传递给构造函数)。

代码语言:javascript
代码运行次数:0
复制
public abstract class GameShape extends Polygon {

    // I got rid of the array fields as I think they are in Polygon anyway.

    //other class variables
    {...}

    // I added arguments to your constructor.
    public GameShape(int[] polyXArray, int[] polyYArray) {

        super(polyXArray, polyYArray, polyXArray.length);
    }
}

问题是super必须是构造函数的第一行,但是可以使用私有方法来构建数组:

代码语言:javascript
代码运行次数:0
复制
public final class BoringRectangle extends GameShape {

    public BoringRectangle(int left, int right, int top, int bottom) {
        super(xArray(left, right), yArray(top, bottom));
    }

    private static int[] xArray(int left, int right) {
        return new int[] {left, right, right, left};
    }

    private static int[] yArray(int top, int bottom) {
        return new int[] {bottom, bottom, top, top};
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33002225

复制
相关文章
如何在R中绘制热力地图
本文介绍了如何利用R语言中的maps包和mapdata包绘制地图,并通过热力地图展示数据分布情况。首先,通过map()函数创建地图对象,并获取每个区域的名字以及顺序。然后,在每个区域的名字和顺序后面,加上需要展示的数据以及经纬度。接着,根据数据的大小设置每个区域的颜色深浅,以区分不同的区域。最后,给地图加上地名标记,并添加热力地图元素。
Erin
2018/01/09
3.2K0
如何在R中绘制热力地图
地图可视化绘制 | R-cartography 艺术地图绘制
本期推文我们介绍一个可以绘制颇具“艺术”风格地图的可视化包-cartography,主要涉及的内容如下:
DataCharm
2021/02/22
9571
地图可视化绘制 | R-cartography 艺术地图绘制
谷歌离线地图开发_谷歌实时在线街景地图
离线地图开发主要有两部分组成:1、获取离线地图数据;因为离线地图一般都是局域网,所以需要离线地图数据放在内网中使用;2、离线地图服务器搭建以及二次开发接口提供,离线地图是一种服务,就像我们Apache提供的WEB服务器一样,他是一种准们的地图服务:提供了包括 WEB服务、TMS服务、WMTS服务等等。
全栈程序员站长
2022/11/08
1.7K0
谷歌离线地图开发_谷歌实时在线街景地图
【Python】pyecharts 模块 ⑤ ( 地图绘制 | pyecharts 地图绘制步骤 | 为地图进行全局配置 )
首先 , 导入 pyecharts 中的 Map 类 , 这是 地图绘制 的核心类 , 该类定义在 pyecharts.charts 中 ;
韩曙亮
2023/10/11
1.5K0
【Python】pyecharts 模块 ⑤ ( 地图绘制 | pyecharts 地图绘制步骤 | 为地图进行全局配置 )
ggplot绘制地图
china_map<-readShapePoly("D:/Beautiful-Visualization-with-R-master/map/bou2_4p.shp")
爱学习的小明明
2020/10/08
1.5K0
ggplot绘制地图
如何在R中绘制树图(TreeMap)
本文介绍了如何利用R语言中的Treemap函数绘制树图,并给出了一个实例,包括使用安装包、设定颜色范围、边框颜色、节点大小、填充颜色等参数。同时还介绍了两种方法,一是通过aggregate函数对数据进行分组,二是通过手动设置index和vSize、vColor、type等参数来绘制树图。
Erin
2018/01/09
5.3K0
如何在R中绘制树图(TreeMap)
如何在标签软件中绘制表格
条码标签软件里有丰富的图形编辑工具,比如手绘曲线、三角形、直线、矩形、圆角矩形、圆形、菱形和五角星等。可以通过这些工具绘制各种图案。还有一部分用户会在标签上设计表格,尤其是做生产或者物流标签。小编下面就介绍一下在标签软件中绘制表格的具体操作步骤。
神奇像素科技
2021/11/12
1.5K0
如何在标签软件中绘制表格
Python | 绘制影像地图(Basemap)
文中代码与数据请点击https://pan.bnu.edu.cn/v/link/view/0cd746194a1e42858583e84ac7fc4e40直接下载,不需要转存。
GIS与遥感开发平台
2022/04/29
6.9K0
Python | 绘制影像地图(Basemap)
使用 plotly 绘制 Choropleth 地图
本文将通过绘制中国省级 Choropleth 地图来解释如何使用 plotly 绘制 Choropleth 地图,主要有两种方法:底层 API plotly.graph_objects.Choroplethmapbox 和高层 API plotly.express.choropleth_mapbox,数据是 COVID-19 在某一天的疫情数据。
Alan Lee
2020/03/18
14.3K7
使用 plotly 绘制 Choropleth 地图
如何绘制省市级地图?
网上有很多关于中国地图绘制教程,但是关于省市级地图绘制非常少,本推文就是来解决这个问题。下面推文主要以浙江省、温州市为例,使用 leaflet 包绘制省/市级地图。
庄闪闪
2022/02/16
2.7K0
如何绘制省市级地图?
单车地图v2版本发布
在线实时查看共享单车的位置,方便进行研究,请查看体验:http://www.dancheditu.com/
贺思聪
2020/04/30
3830
单车地图v2版本发布
geopandas:Python绘制数据地图
GeoPandas是一个Python开源项目,旨在提供丰富而简单的地理空间数据处理接口。 GeoPandas扩展了Pandas的数据类型,并使用matplotlib进行绘图。GeoPandas官方仓库地址为:GeoPandas。 GeoPandas的官方文档地址为:GeoPandas-doc。 本文主要参考GeoPandas Examples Gallery。 GeoPandas的基础使用见Python绘制数据地图1-GeoPandas入门指北。 GeoPandas的可视化入门见Python绘制数据地图2-GeoPandas地图可视化。
luckpunk
2023/09/14
3.6K0
geopandas:Python绘制数据地图
使用echarts绘制地图
最近我参与了几个数据大屏可视化项目,项目中要求在大屏上以地图的形式直观的展示某一地区的某个业务数据,在绘制地图时踩的坑还是挺多的,特此用一篇博客记录一下绘制地图的过程,下面会以展示江西省下面各城市手机品牌数为例介绍地图的绘制方法。
用户3880999
2023/04/13
1.2K0
使用echarts绘制地图
地图可视化:geopandas绘制拓扑着色地图
我们在绘制某些地图时,为了凸显出每个独立的区域,需要满足拓扑着色要求,即所有相邻的区域不可以用同一种颜色绘制,以前的手绘地图需要绘制者自行思考设计具体的着色规则,而现如今通过计算机的辅助,我们可以快速生成大量的着色方案。
朱卫军 AI Python
2022/04/03
1.6K0
地图可视化:geopandas绘制拓扑着色地图
如何在小程序中绘制图表?
文 | musiq1989 由于微信小程序本身框架的限制,很难集成目前已有的图表工具,显示图表目前有两种方案: 服务器端渲染图表,输出图片,微信小程序中直接显示渲染好的图片; 利用微信小程序 API 中提供的 canvas 组件支持,自行绘制图表。 前一种方案已经有非常多类似服务可选,比如 Highcharts 提供了服务端渲染的能力。但这种方式需要后台有一套渲染服务,并且有一定的网络开销。 那么,如何利用 canvas 组件,在小程序中绘制图表呢?下面,我们就来看尝试一下。 API 首先,我们在模板文件中
知晓君
2018/06/28
1.4K0
绘制中国个省份地图
p<-choose.files() #导入bou4_4m/BOUNT_poly.shp文件
爱学习的小明明
2020/10/13
1.9K0
绘制中国个省份地图
绘制自定义迷宫地图
/* 功能:绘制自定义迷宫地图 日期:2013-05-26 */ #include<stdio.h> #include<stdlib.h> #include<math.h> #define LEN 8 int main(void) { int A[LEN][LEN]={0}; int i,j; char ch1;
WindCoder
2018/09/20
8180
[710]python使用pyecharts绘制地图
pyecharts 是一个用于生成 Echarts 图表的类库。Echarts 是百度开源的一个数据可视化 JS 库。用 Echarts 生成的图可视化效果非常棒,pyecharts 是为了与 Python 进行对接,方便在 Python 中直接使用数据生成图。
周小董
2020/01/13
3.7K0
[710]python使用pyecharts绘制地图
3.6.2 编程实例-河南地图绘制
#include <iostream> #include <fstream> #include<vector> #include <GL/glut.h> using namespace std;
步行者08
2018/10/09
7550
点击加载更多

相似问题

ActionScript事件处理程序执行顺序

24

actionscript 3.0函数mouseevent事件处理程序

13

ActionScript 2-请帮助处理外部AS文件

10

ActionScript 2- ActionScript 3:公共子集?

21

actionscript中的事件处理

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文