Почему не абстрактные поля?



почему классы Java не могут иметь абстрактные поля, как они могут иметь абстрактные методы?



например: у меня есть два класса, которые расширяют один и тот же абстрактный базовый класс. Каждый из этих двух классов имеет метод, который идентичен, за исключением Строковой константы, которая является сообщением об ошибке, внутри них. Если бы поля могли быть абстрактными, я мог бы сделать эту константу абстрактной и вытащить метод в базовый класс. Вместо этого, я должен создать абстрактный метод, называемый getErrMsg() in в этом случае, который возвращает строку, переопределите этот метод в двух производных классах, а затем я могу вытащить метод (который теперь вызывает абстрактный метод).



почему я не мог просто сделать поле абстрактным для начала? Может быть, Java была разработана, чтобы позволить это?

602   5  

5 ответов:

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

abstract class Base {

    final String errMsg;

    Base(String msg) {
        errMsg = msg;
    }

    abstract String doSomething();
}

class Sub extends Base {

    Sub() {
        super("Sub message");
    }

    String doSomething() {

        return errMsg + " from something";
    }
}

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

Я не вижу смысла в этом. Вы можете переместить функцию в абстрактный класс и просто переопределить некоторые защищенные поля. Я не знаю, если это работает с константами, но эффект тот же:

public abstract class Abstract {
    protected String errorMsg = "";

    public String getErrMsg() {
        return this.errorMsg;
    }
}

public class Foo extends Abstract {
    public Foo() {
       this.errorMsg = "Foo";
    }

}

public class Bar extends Abstract {
    public Bar() {
       this.errorMsg = "Bar";
    }
}

Итак, ваша точка зрения заключается в том, что вы хотите обеспечить реализацию/переопределение/независимо от errorMsg в подклассах? Я думал, что вы просто хотели иметь метод в базовом классе и не знали, как обращаться с полем тогда.

очевидно может были разработаны, чтобы позволить это, но под крышками все равно придется делать динамическую отправку, и, следовательно, вызов метода. Дизайн Java (по крайней мере, в первые дни) был в некоторой степени попыткой быть минималистичным. То есть, дизайнеры старались избегать добавления новых функций, если они могут быть легко смоделированы другими функциями уже на языке.

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

Я часто хотел, чтобы я мог объявить метод, подобный следующему в Java:

public abstract class MyClass {

    public static abstract MyClass createInstance();

    // more stuff...

}

в принципе, я хотел бы настаивать на том, что конкретные реализации моего родительского класса предоставляют статический метод фабрики с определенной сигнатурой. Это позволит мне получить ссылку на конкретный класс с Class.forName() и будьте уверены, что я мог бы построить один в Конвенции по моему выбору.

field.

public abstract class Base {
  public final int field;
  public Base() {
    if (this instanceof SubClassOne) {
      field = 1;
    } else if (this instanceof SubClassTwo) {
      field = 2;
    } else {
      // assertion, thrown exception, set to -1, whatever you want to do 
      // to trigger an error
      field = -1;
    }
  }
}

Comments

    Ничего не найдено.