Абстрактные переменные в Java?

Операция отклонена вашей операцией. Возможно, файл уже использовался (текстовым редактором или антивирусом) или у вас недостаточно прав для доступа к нему. Если вы считаете, что это может быть проблема с разрешениями, пожалуйста, дважды проверьте права доступа к файлу и содержащим его каталогам или попробуйте снова запустить команду от имени пользователя root / Administrator (хотя это не рекомендуется).

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

cd для проекта Node в месте в локальной файловой системе, где у вас есть разрешения, или запустите npm в командной строке уровня администратора.

45
задан Bob 18 June 2013 в 13:30
поделиться

11 ответов

Я думаю, ваша путаница связана со свойствами C # и полями / переменными. В C # вы не можете определять абстрактные поля даже в абстрактном классе. Однако вы можете определить абстрактные свойства, поскольку это эффективные методы (например, скомпилированные в get_TAG () и set_TAG (...) ).

Как некоторые напомнили, в ваших классах никогда не должно быть публичных полей / переменных, даже в C #. Несколько ответов намекали на то, что я бы порекомендовал, но не прояснили это. Вы должны перевести свою идею на Java как свойство JavaBean, используя getTAG (). Затем ваши подклассы должны будут это реализовать (я также написал проект с классами таблиц, которые это делают).

Итак, вы можете определить абстрактный класс следующим образом ...

public abstract class AbstractTable {

    public abstract String getTag();
    public abstract void init();

    ...
}

Затем в любых конкретных подклассах вам нужно будет определить статическую конечную переменную (константу) и вернуть ее из getTag () , примерно так:

public class SalesTable extends AbstractTable {

    private static final String TABLE_NAME = "Sales";

    public String getTag() {
        return TABLE_NAME;
    }

    public void init() {
        ...
        String tableName = getTag();
        ...
    }

}

РЕДАКТИРОВАТЬ :

Вы не можете переопределить унаследованные поля (ни в C #, ни в Java). Вы также не можете переопределить статические члены, будь то поля или методы. Так что это лучшее решение для этого. Я изменил приведенный выше пример метода инициализации, чтобы показать, как это будет использоваться - опять же, думайте о методе getXXX как о свойстве.

50
ответ дан 26 November 2019 в 20:58
поделиться

В моем эксперименте абстрактный класс Java действительно должен указать ключевое слово краткого обзора . Reversely, ошибка, что "абстрактный модификатор не может быть помещен здесь", предложат. Можно указать абстрактные атрибуты точно так же, как обычные атрибуты.

public abstract class Duck implements Quackable, Observable {
    // observerList should keep the list of observers watching this duck 
    List<Observer> observerList;

    public AttackBehavior attackBehavior;
    public FlyBehavior flyBehavior;

    public Duck() {
        observerList = new ArrayList<Observer>();
    }
}

И в подклассе, можно непосредственно использовать эти атрибуты this.flyBehavior или this.attackBehavior. Вы не должны переписывать атрибуты в поле атрибута.

0
ответ дан 26 November 2019 в 20:58
поделиться

Нет такой вещи, как абстрактные переменные в Java (или C ++).

Если родительский класс имеет переменную, а дочерний класс расширяет родительский, тогда дочерний класс не должен реализовывать переменную. Ему просто нужен доступ к родительскому экземпляру. Либо get / установить или защищенный доступ будет делать .

«... значит, мне нужно предложить реализовать тезисы»? Если вы расширяете абстрактный класс и не можете реализовать абстрактный метод, компилятор скажет вам либо реализовать его, либо пометить подкласс как абстрактный. Это все, что вы получите.

7
ответ дан 26 November 2019 в 20:58
поделиться

Лучшее, что вы могли сделать, - это использовать средства доступа / мутаторы для переменной.
Что-то вроде getTAG ()
Таким образом, все реализующие классы должны были бы их реализовать.

Абстрактные классы используются для определения абстрактного поведения, а не данных.

2
ответ дан 26 November 2019 в 20:58
поделиться

Почему вы хотите, чтобы все подклассы определяли переменную? Если предполагается, что он есть в каждом подклассе, просто определите его в суперклассе. Кстати, учитывая, что хорошая практика ООП в любом случае не раскрывать поля, ваш вопрос имеет еще меньше смысла.

1
ответ дан 26 November 2019 в 20:58
поделиться

Чтобы добавить метаданные для каждого класса, возможно, лучше всего подойдет аннотация.

Тем не менее, вы не можете обеспечить наличие аннотации в интерфейсе, так же как вы не можете обеспечить статические члены или существование определенного конструктора.

1
ответ дан 26 November 2019 в 20:58
поделиться

Нет, Java не поддерживает абстрактные переменные. Это тоже не имеет большого смысла.

Какие конкретные изменения в «реализации» переменной, по вашему мнению, должен сделать подкласс?

Когда у меня есть переменная abstract String в базовом классе, что должно подкласс сделать, чтобы он не был абстрактным?

-1
ответ дан 26 November 2019 в 20:58
поделиться

Просто добавьте этот метод к базовому классу

public abstract class clsAbstractTable {

    public abstract String getTAG();
    public abstract void init();

}

Теперь каждый класс, расширяющий базовый класс (и не желающий быть абстрактным), должен предоставлять ТЕГ

Вы также можете использовать ответ BalusC

2
ответ дан 26 November 2019 в 20:58
поделиться

Поскольку нет реализации переменной, она не может быть абстрактной ;)

1
ответ дан 26 November 2019 в 20:58
поделиться

Определите конструктор в абстрактном классе, который устанавливает поле так, чтобы конкретные реализации соответствовали спецификации, необходимой для вызова / переопределения конструктора.

Например.

public abstract class AbstractTable {
    protected String name;

    public AbstractTable(String name) {
        this.name = name;
    }
}

Когда вы расширяете AbstractTable , класс не будет компилироваться, пока вы не добавите конструктор, который вызывает super ("somename") .

public class ConcreteTable extends AbstractTable {
    private static final String NAME = "concreteTable";

    public ConcreteTable() {
        super(NAME);
    }
}

Таким образом, разработчики должны установить имя . Таким образом, вы также можете выполнять (нулевые) проверки в конструкторе абстрактного класса, чтобы сделать его более надежным. Например:

public AbstractTable(String name) {
    if (name == null) throw new NullPointerException("Name may not be null");
    this.name = name;
}
58
ответ дан 26 November 2019 в 20:58
поделиться

Измените код на:

public abstract class clsAbstractTable {
  protected String TAG;
  public abstract void init();
}

public class clsContactGroups extends clsAbstractTable {
  public String doSomething() {
    return TAG + "<something else>";
  }
}

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

Примечание: не используйте CAPS в качестве имени переменной; общепринято считать, что все идентификаторы с заглавными буквами относятся к константам, т.е. неизменяемым частям данных.

1
ответ дан 26 November 2019 в 20:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: