2010-08-18 1 views
2

У меня есть абстрактный класс с одним конкретным методом. В этом методе я хочу использовать статическую переменную класса из классов, которые вытекают из того, в котором объявлен метод. Для этого я, конечно же, должен объявить эту статическую переменную в абстрактном классе.Могу ли я получить доступ к статическим переменным-членам, определенным в подклассе, из метода абстрактного суперкласса?

Когда метод вызывается, переменная разрешается только в моем базовом базовом классе, а не в производном классе. Нужно ли украшать свойство производного класса атрибутом?

Я пытаюсь сделать что-то, что не поддерживается на Java, или я просто что-то упустил?

+1

Я предполагаю, что вы имеете в виду «с одним конкретным методом» в вашем первом предложении ... – pgras

+0

Да, просто исправил это. Благодарю. – Rich

ответ

12

Вы пытаетесь сделать что-то, что не поддерживается. Поля не могут быть «переопределены» - и статические члены не ведут себя полиморфно.

Вместо этого создайте абстрактные свойства, которые могут быть реализованы в производных классах. Они должны быть экземплярами свойствами, даже если они возвращают статические переменные.

+0

«Свойство» не используется во многих случаях в Java за пределами JavaBeans. С технической точки зрения, вы говорите о чем-то вроде этого: 'protected abstract SomeType getSomething();' эти подклассы будут реализовывать, правильно? –

+0

@Mark: Я не верю, что это правда. Насколько я знаю, термин «свойство» используется по всей Java. JavaBeans кодифицировал его, но я видел, что он использовался во многих дискуссиях, которые не имеют ничего общего с JavaBeans. Но да, эта подпись метода - это то, о чем я говорю. –

+0

Итак, теоретически, используя Animal <-Dog, Animal <-Cat и т. Д. Если нужно реализовать счетчик экземпляров для каждого подкласса Animal, используя статическую (Class) переменную, чтобы удерживать счетчик (с добавлением в конструкторе класса), вы должны реализовать getInstanceCount() для каждого подкласса, даже если код практически идентичен (единственное различие заключается в том, что другое имя класса в каждом классе ({return Dog.count}, {return Cat.count}). Является ли это правильным утверждением? Если однажды ваш босс сказал, сделайте getInstanceCount() return long вместо int .. вам придется обновить все 600 методов getInstanceCount()? –

0

В зависимости от того, что вы хотите сделать, вы можете сделать:

Base b = new Sub(); 
    System.out.println(b.myInt); // will print myInt from Base 

    Sub s = new Sub(); 
    System.out.println(s.myInt); // will print myInt from Sub 

, но вы, вероятно, хотите подход Джона.

2

Вы не можете переопределять переменные, а только методы. Если его вероятность того, что подкласс должен дать другое значение, добавьте метод getter в класс, который это делает.

abstract class Foo { 
    static private final String someValue = "blah"; 

    String getSomeValue() { 
    return someValue; 
    } 

    public abstract void someMethod(); 
} 

class Bar extends Foo { 
    String getSomeValue() { 
    return "somethingElse"; 
    } 

    public void someMethod() { 
    String x = getSomeValue(); 
    } 
}