/ / Има ли някакъв начин да се приложи „метод на абстрактния клас“ в Java? [дубликат] - java

Има ли някакъв начин да се приложи „метод на абстрактния клас“ в Java? [дубликат] - java

Update: Знам, че статичният метод не може да бъде абстрактен и знам защо и това не е въпрос от рода на „Дали е възможно?“ Или „защо не е възможно?“, Просто искам да знам дали има някакъв начин да получа това, което искам.

Е, ако сте чували за @classmethod в python, можете да пропуснете останалото.

И ето какво искам: В някои случаи някои методи са просто функции, което ми трябва само е неговата функционалност. В Java обаче трябва да поставите всичко в клас, така че трябва да ги увивам функция в клас и ги поставете статични. Работата е там, че за класове като този, аз не "t, и не трябва да имам нужда от някой от неговите инстанции. А междувременно искам някаква йерархия за такива класове. Йерархията тук работи като някакъв "контрол": Мога да контролирам подкласове за това, което трябва да правите, така или и какъв метод / функция трябва да имате.


Както всички знаем, не можем да декларираме a static abstract метод в даден клас.

Въпреки това, може да има ситуации, когато се нуждаете само от метода, а не от екземпляр и трябва методът да бъде абстрактен и да го приложите в подкласове.

Някои момчета посочиха това това може да е лош дизайн в Java, но има ли възможно решение за това?

Отговори:

2 за отговор № 1

Не, не можете
Главно защото термините на "абстрактния" и "статичния" метод си противоречат. Вижте подробно обяснение тук: Защо статичните методи не могат да бъдат абстрактни в Java


1 за отговор № 2

статичният ви метод не може да бъде абстрактен, но бихте могли да използвате функционални интерфейси, като предварително зададените функция, BiFunction или дори Консуматор най-вероятно ще отговаря на всички ваши нужди, ето списък на предварително дефинираните интерфейси: http://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html

Ако те не се вписват във вашите изисквания, можете напишете свои собствени интерфейси и следователно да бъде в състояние да предава произволни методи-референции около ... бъдете сигурни винаги проверявайте за null, макар че


0 за отговор № 3

Статичните методи не могат да бъдат обявени за абстрактни, тъй като отменянето (подтип полиморфизъм) не се прилага за статични методи. Ако имате нужда от решение тук:

public void myMainFunction() {
ArrayList<Animal> animals = new ArrayList<Animal>();
animals.add(AnimalFactory.createAnimal(Bird.class,birdXML));
animals.add(AnimalFactory.createAnimal(Dog.class,dogXML));
}

public abstract class Animal {
/**
* Every animal subclass must be able to be created from XML when required
* (E.g. if there is a tag <bird></bird>, bird would call its "createFromXML" method
*/
public abstract Animal createFromXML(String XML);
}

public class Bird extends Animal {
@Override
public Bird createFromXML(String XML) {
// Implementation of how a bird is created with XML
}
}

public class Dog extends Animal {
@Override
public Dog createFromXML(String XML) {
// Implementation of how a dog is created with XML
}
}

public class AnimalFactory{
public static <T extends Animal> Animal createAnimal(Class<T> animalClass, String xml) {
// Here check class and create instance appropriately and call createFromXml
// and return the cat or dog
}
}

Разбрах го оттук: Статично абстрактно решение