Невозможно объявить абстрактный метод private
Я хочу сделать это, но я не могу. Вот мой сценарий и разумный. У меня есть абстрактный класс для тестовых примеров с абстрактным методом test(). Метод test() должен определяться подклассом; он должен быть реализован с логикой для определенного приложения, например CRMAppTestCase extends CompanyTestCase
. Я не хочу, чтобы метод test() вызывался напрямую, я хочу, чтобы суперкласс вызывал метод test(), в то время как подкласс может вызывать метод, который вызывает это (и выполняет другую работу, например, установку текущего дата-время перед тестированием, например). Пример кода:
public abstract class CompanyTestCase {
//I wish this would compile, but it cannot be declared private
private abstract void test();
public TestCaseResult performTest() {
//do some work which must be done and should be invoked whenever
//this method is called (it would be improper to expect the caller
// to perform initialization)
TestCaseResult result = new TestCaseResult();
result.setBeginTime(new Date());
long time = System.currentTimeMillis();
test(); //invoke test logic
result.setDuration(System.currentTimeMillis() - time);
return result;
}
}
Затем, чтобы расширить это....
public class CRMAppTestCase extends CompanyTestCase {
public void test() {
//test logic here
}
}
Тогда, чтобы назвать это....
TestCaseResult result = new CRMAppTestCase().performTest();
Ответы
Ответ 1
Частные методы не являются полиморфными (вы не можете их наследовать), поэтому нет смысла делать частный реферат метода. Создание абстрактного метода означает, что вам придется переопределить и реализовать его в подклассе, но поскольку вы не можете переопределить частные методы, вы также не можете сделать их абстрактными.
Вы должны сделать это protected
вместо private
.
Частный действительно означает закрытый для класса, в котором вы определили метод; даже подклассы не видят частные методы.
Ответ 2
Я хочу сделать это, но я не могу
Для этого потребуется переписать компилятор, что маловероятно.
Вы понимаете, почему это никогда не может работать, не так ли? Подкласс не может переопределить частный метод, но он абстрактный, который говорит, что они должны. Словить 22.
Ответ 3
'private' означает, что метод может быть вызван только классом. Поэтому он должен быть определен в классе и поэтому не может быть абстрактным. Если вы хотите определить метод в другом месте, вам придется сделать что-то другое, чем личное.
Ответ 4
Я хотел бы указать, что выбор Java не позволяет реализовать абстрактные частные методы (например, на С++ вы можете и желательно). Говорить, что частные методы не являются полиморфными вообще, просто не знают о том, что вызов и определение метода - это два разных механизма - хотя подклассы никогда не могут вызывать частный метод суперкласса, они могли бы определить его. Смешивание двух является распространенным заблуждением, пожалуйста, имейте в виду.
У меня недостаточно репутации для комментариев, поэтому я пишу ответ.
Ответ 5
У вас не может быть метода private abstract
, потому что подклассы не могут видеть частных членов суперкласса. Вам нужно сделать свой test
метод protected
.
Ответ 6
abstract означает, что вы хотите определить метод в дочернем классе
private означает, что дочерние классы не будут видеть метод
Как это можно скомпилировать?
Если метод должен быть общедоступным, объявите его публичным абстрактом, что все.
Ответ 7
Вы должны объявить свой "тестовый" метод "защищенным" для достижения своей цели. Но он все равно будет доступен из пакета класса.