Как получить доступ к публичным константным переменным основного класса из подкласса? - PullRequest
1 голос
/ 02 апреля 2011

У меня есть основной класс с парой открытых константных переменных, и у меня есть собственный класс, я хотел бы знать, как я могу получить доступ к константам основного класса из пользовательского класса?

MainКод класса:

import processing.core.*;
import toxi.geom.*;
import toxi.math.*;

public class VoronoiTest extends PApplet {

    // this are the constants I want to access from the Site class
    public static int NUM_SITES         = 8;
    public static int SITE_MAX_VEL      = 2;
    public static int SITE_MARKER_SIZE  = 6;

    Site[] sites;

    public void setup() {
        size( 400, 400 );

        sites = new Site[NUM_SITES];
        for ( int i = 0; i < sites.length; i++) {
            sites[i] = new Site( this );
        }
    }
}

И это код класса сайта:

import processing.core.*;


public class Site {
    PApplet parent;

    float x, y;
    PVector vel;

    int c;

    Site ( PApplet p ) {
            parent = p;
            // here I try to get the constants from the main class
            vel = new PVector( parent.random(-parent.SITE_MAX_VEL, SITE_MAX_VEL), parent.random(-SITE_MAX_VEL, SITE_MAX_VEL) );     
    }   
}

Любая помощь будет высоко ценится!

Ответы [ 3 ]

3 голосов
/ 02 апреля 2011

Вы не можете.Поскольку parent имеет тип PApplet, а не VoronoiTest, вы не можете гарантировать, что он имеет статический член SITE_MAX_VEL.

И наоборот, если parent были типа VoronoiTest, было бы мало смысла обращаться к статической переменной через экземпляр, так как ее было бы невозможно изменить.

Как уже упоминалось, для доступа к статическим элементам используйте обозначение ClassName.STATIC_MEMBER (в этомcase, VoronoiTest.SITE_MAX_VEL).

Еще лучше, но вместо этого просто сохраните константы в классе Site.В конце концов, это кажется им наиболее логичным.

import processing.core.*;

public class Site {
    public static final int COUNT       = 8;
    public static final int MAX_VEL     = 2;
    public static final int MARKER_SIZE = 6;

    PApplet parent;

    float x, y;
    PVector vel;

    int c;

    Site(PApplet p) {
        parent = p;
        vel = new PVector(
            parent.random(-MAX_VEL, MAX_VEL),
            parent.random(-MAX_VEL, MAX_VEL)
        );     
    }   
}
0 голосов
/ 02 апреля 2011

Статические поля доступны через имя класса. Используйте VoronoiTest.SITE_MAX_VEL.

0 голосов
/ 02 апреля 2011

Воспользуйтесь ссылкой VoronoiTest. VoronoiTest.SITE_MAX_VEL, например. Когда вы используете ссылку PApplet, компилятор не может знать, что статические переменные существуют.

...