【发布时间】:2018-06-29 17:17:30
【问题描述】:
我正在尝试用天然卫星制作一个太阳系。目前我正在绘制一个相对于静态“太阳”类对象的行星,但我想让该类使用另一个行星对象的位置并相对于该行星进行绘制。为此,我需要提取该行星对象的 x 和 y 位置。
这是我用来绘制行星的类的类构造函数。
Nebesko_Telo merkur = new Nebesko_Telo(Sun.x, Sun.y, 4, 12, 4.090909090909091,
1, 255, 255, 255);
// A field initializer cannot reference the non-static field, method,
// or property 'Form1.merkur'.
Nebesko_Telo venera = new Nebesko_Telo(merkur.x, merkur.y, 1, 23, 1.5, 1, 176, 108, 32);
这是类构造函数。
public Nebesko_Telo(doubl _rel_tel_x, double _rel_tel_y, double _r, double _or,
double _Fi_mult, double _tilt_plant_nat, int _re, int_gr, int _bl) {
r = _r;
or = _or;
Fi_mult = _Fi_mult;
re = _re;
gr = _gr;
bl = _bl;
tilt_planet_nat = _tilt_planet_nat;
rel_tel_x = _rel_tel_x;
rel_tel_y = _rel_tel_y;
}
x 和 y 位置会随着每个刻度不断更新,所以我需要它不断更新它:^/.
【问题讨论】:
-
主要建议 - 尽量不要使用静态。相反,请阅读控制反转和依赖注入以及一般来说什么是服务定位器。您的问题实际上是一个很常见的问题,IoC 概念极大地帮助您在专业开发人员的水平上开发应用程序。
-
欢迎来到 SO。请发布Minimal, Complete, and Verifiable Example,以便您的问题可以重现。另外,不要链接到屏幕截图,请在此处复制粘贴代码的相关部分。
-
请不要将代码截图发布到 SO,除非您的问题实际上是关于调试器 UI 的某些元素。它很难阅读,我们不能剪切粘贴,等等。
-
相反,将代码(和任何错误消息)剪切并粘贴到答案中,然后使用代码格式化工具。
-
您可以考虑使用的两种技术是 (1) 使您的数据结构不可变。也就是说,太阳系在特定时间的快照。当您进行时间步长时,您会创建一个 new 快照。这真的不会消耗那么多内存。行星在特定时间的轨道特征可以用几十个双倍来概括,以达到一个很好的近似值。这意味着您可以轻松地存储快照、向前和向后运行模拟等等。推断一致的数据也更容易,因为它不会改变。
标签: c# class constructor static non-static