Операция отклонена вашей операцией. Возможно, файл уже использовался (текстовым редактором или антивирусом) или у вас недостаточно прав для доступа к нему. Если вы считаете, что это может быть проблема с разрешениями, пожалуйста, дважды проверьте права доступа к файлу и содержащим его каталогам или попробуйте снова запустить команду от имени пользователя root / Administrator (хотя это не рекомендуется).
blockquote>Совершенно очевидно, что пользователь, с которым вы работаете
npm
, не имеет правильных прав для создания папок по привилегированным путям, упомянутым в первой половине текста ошибки.
cd
для проекта Node в месте в локальной файловой системе, где у вас есть разрешения, или запуститеnpm
в командной строке уровня администратора.
Я думаю, ваша путаница связана со свойствами 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 как о свойстве.
В моем эксперименте абстрактный класс 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
. Вы не должны переписывать атрибуты в поле атрибута.
Нет такой вещи, как абстрактные переменные в Java (или C ++).
Если родительский класс имеет переменную, а дочерний класс расширяет родительский, тогда дочерний класс не должен реализовывать переменную. Ему просто нужен доступ к родительскому экземпляру. Либо get / установить или защищенный доступ будет делать .
«... значит, мне нужно предложить реализовать тезисы»? Если вы расширяете абстрактный класс и не можете реализовать абстрактный метод, компилятор скажет вам либо реализовать его, либо пометить подкласс как абстрактный. Это все, что вы получите.
Лучшее, что вы могли сделать, - это использовать средства доступа / мутаторы для переменной.
Что-то вроде getTAG ()
Таким образом, все реализующие классы должны были бы их реализовать.
Абстрактные классы используются для определения абстрактного поведения, а не данных.
Почему вы хотите, чтобы все подклассы определяли переменную? Если предполагается, что он есть в каждом подклассе, просто определите его в суперклассе. Кстати, учитывая, что хорошая практика ООП в любом случае не раскрывать поля, ваш вопрос имеет еще меньше смысла.
Чтобы добавить метаданные для каждого класса, возможно, лучше всего подойдет аннотация.
Тем не менее, вы не можете обеспечить наличие аннотации в интерфейсе, так же как вы не можете обеспечить статические члены или существование определенного конструктора.
Нет, Java не поддерживает абстрактные переменные. Это тоже не имеет большого смысла.
Какие конкретные изменения в «реализации» переменной, по вашему мнению, должен сделать подкласс?
Когда у меня есть переменная abstract
String
в базовом классе, что должно подкласс сделать, чтобы он не был абстрактным?
Просто добавьте этот метод к базовому классу
public abstract class clsAbstractTable {
public abstract String getTAG();
public abstract void init();
}
Теперь каждый класс, расширяющий базовый класс (и не желающий быть абстрактным), должен предоставлять ТЕГ
Вы также можете использовать ответ BalusC
Поскольку нет реализации переменной, она не может быть абстрактной ;)
Определите конструктор в абстрактном классе, который устанавливает поле так, чтобы конкретные реализации соответствовали спецификации, необходимой для вызова / переопределения конструктора.
Например.
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;
}
Измените код на:
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 в качестве имени переменной; общепринято считать, что все идентификаторы с заглавными буквами относятся к константам, т.е. неизменяемым частям данных.