왜 추상적인 필드를 사용하지 않는가?
Java 클래스는 왜 추상 메서드에서와 같은 추상 필드를 가질 수 없습니까?
예를 들어 다음과 같습니다.동일한 추상 기본 클래스를 확장하는 클래스가 두 개 있습니다.이들 2개의 클래스에는 각각 동일한 메서드가 있습니다.단, 스트링 상수는 에러 메시지입니다.필드가 추상적일 수 있다면 이 상수 추상화 방법을 기본 클래스로 끌어올릴 수 있습니다.대신, 저는 추상적인 방법을 만들어야 합니다.getErrMsg()
이 경우 String을 반환하고 파생된2개의 클래스에서 이 메서드를 덮어쓰면 메서드를 풀업할 수 있습니다(이 메서드는 현재 추상 메서드를 호출합니다).
왜 처음부터 이 분야를 추상화하지 못했을까요?Java가 이를 허용하도록 설계되었을까요?
추상 클래스의 최종 필드가 생성자(테스트되지 않은 코드)에 초기화되어 있으면 설명한 작업을 수행할 수 있습니다.
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
아류에서요?나는 당신이 단지 기본 수업에서 그 방법을 가지고 싶어하고 그 때는 필드를 어떻게 다루어야 할지 몰랐다고 생각했다.
물론 이 기능을 사용할 수 있도록 설계되었을 수도 있지만, 이 기능을 사용하려면 여전히 동적 디스패치를 수행해야 하며, 따라서 메서드 호출이 필요합니다.자바의 디자인은 (적어도 초창기에는) 어느 정도 미니멀리즘적이기 위한 시도였다.즉, 설계자는 언어의 다른 기능으로 쉽게 시뮬레이트할 수 있다면 새로운 기능을 추가하는 것을 피하려고 했습니다.
당신의 제목을 읽었을 때, 추상적인 인스턴스 멤버를 말하는 것 같아서 별로 쓸모가 없었습니다.하지만 추상적인 정적 구성원은 완전히 다른 문제이다.
자바에서 다음과 같은 방법을 선언할 수 있으면 좋겠다고 생각했습니다.
public abstract class MyClass {
public static abstract MyClass createInstance();
// more stuff...
}
기본적으로는, 부모 클래스의 구체적인 실장은, 특정의 시그니처를 가지는 정적인 공장 방식을 제공한다고 주장하고 싶다. 하면 구체적인 에서 '아주 좋다'를 할 수 .Class.forName()
그리고 내가 선택한 컨벤션에서 하나를 만들 수 있다는 것을 확신하라.
다른 옵션은 필드를 기본 클래스에서 퍼블릭(최종인 경우)으로 정의한 다음 현재 사용 중인 하위 클래스에 따라 기본 클래스의 생성자에서 해당 필드를 초기화하는 것입니다.순환 의존성을 도입한다는 점에서 좀 애매합니다.할 수 서브클래스는 하지 않지만 의 메서드나 가 어, 어, can, can, can, can, can, can, can, can, can, can, can, can, can, can, can, can, can, can, can, can, can, can, can, can, can, can, can, can, can, can, can, can, can, can, , can, can, 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;
}
}
}
언급URL : https://stackoverflow.com/questions/2211002/why-not-abstract-fields
'source' 카테고리의 다른 글
개체의 정규화되지 않은(짧은) 클래스 이름을 가져오려면 어떻게 해야 합니까? (0) | 2023.01.17 |
---|---|
MySql과의 연결이 자동으로 중단됩니다.커넥터/J를 올바르게 설정하는 방법 (0) | 2023.01.17 |
vue-i18n 번역의 html 태그 베스트 프랙티스 (0) | 2023.01.17 |
MySQL/MariaDB에서 저장 프로시저를 생성하는 중 오류 발생 (0) | 2023.01.17 |
가져오기 및 전달 모드 사용 시도 중: no-cors (0) | 2023.01.17 |