상속을 통한 열거형 확장
enums의 개념에 어긋나는 것은 알고 있습니다만, enums를 C#/Java로 연장할 수 있습니까?열거형에 새로운 값을 추가한다는 의미와 기존 열거형에서 상속한다는 OO의 의미 모두에서 "확장"을 의미합니다.
자바에서는 아직 얼마 전(Java 5?)에 도착했기 때문에 불가능하다고 생각합니다.하지만 C#은 미친 짓을 하고 싶어하는 사람들을 더 용서하는 것 같아서 어떤 식으로든 가능할 거라고 생각했어요.아마 리플렉션에 의해 해킹될 수 있을 것 같습니다(모든 사람이 실제로 그 방법을 사용한다는 것은 아닙니다).
저는 반드시 어떤 방법을 도입하는 것에 관심이 있는 것은 아닙니다.그게 생각났을 때 호기심을 불러일으켰을 뿐이에요:-)
Enums를 연장할 수 없는 이유는 다형성 문제로 이어질 수 있기 때문입니다.
값이 A, B 및 C인 열거형 MyEnum이 있으며 값 D를 MyExtEnum으로 하여 확장한다고 가정합니다.
예를 들어 파라미터로서 myEnum 값을 요구하는 메서드가 있다고 가정합니다.MyExtEnum 값은 서브타입이기 때문에 적법해야 합니다만, 이 값이 D로 판명되면 어떻게 하시겠습니까?
이 문제를 제거하기 위해 Enum을 확장하는 것은 불법입니다.
내장된 에넘이 충분하지 않을 때는 옛날 패션 방식으로 직접 만들 수 있습니다.예를 들어 설명 필드 등의 추가 속성을 추가하려면 다음과 같이 할 수 있습니다.
public class Action {
public string Name {get; private set;}
public string Description {get; private set;}
private Action(string name, string description) {
Name = name;
Description = description;
}
public static Action DoIt = new Action("Do it", "This does things");
public static Action StopIt = new Action("Stop It", "This stops things");
}
그런 다음 다음과 같이 열거형으로 처리할 수 있습니다.
public void ProcessAction(Action a) {
Console.WriteLine("Performing action: " + a.Name)
if (a == Action.DoIt) {
// ... and so on
}
}
이 방법은 생성자가 개인(또는 상속할 경우 보호됨)이고 인스턴스가 정적인지 확인하는 것입니다.
잘못된 방향으로 가고 있습니다. 열거형의 하위 클래스는 엔트리가 적습니다.
의사 코드에서는 다음과 같이 생각합니다.
enum Animal { Mosquito, Dog, Cat };
enum Mammal : Animal { Dog, Cat }; // (not valid C#)
동물을 받아들일 수 있는 어떤 방법도 포유류를 받아들일 수 있어야 하지만, 그 반대로는 안 됩니다.하위 분류는 더 일반적인 것이 아니라 더 구체적인 것을 만들기 위한 것입니다.그렇기 때문에 "object"가 클래스 계층의 루트입니다.마찬가지로 enum이 상속 가능한 경우 열거 계층의 가상 루트에는 가능한 모든 기호가 포함됩니다.
그러나 C#/Java에서는 서브에넘인 AFAICT는 사용할 수 없습니다.단, AFAICT는 때때로 매우 유용합니다.내장 기호(리스프 등)가 아닌 Enums를 int(C 등)로 구현했기 때문일 것입니다.(위의 (동물)1은 무엇을 나타내며 (동물)1은 무엇을 나타내며, 같은 값입니까?)
다만, 이것을 제공하는 독자적인 열거형 클래스(다른 이름으로)를 작성할 수 있습니다.C# 속성을 사용하면 보기 좋을 수도 있습니다.
Enums는 가능한 모든 값의 열거를 나타내도록 되어 있기 때문에 확장하면 아이디어에 반합니다.
단, Java(및 아마도 C++0x)에서 실행할 수 있는 것은 열거 클래스가 아닌 인터페이스를 사용하는 것입니다.그런 다음 기능을 구현하는 열거형에 표준 값을 입력합니다.java.util을 사용할 수 없습니다.EnumSet 등입니다.이는 JDK7에 있어야 하는 "더 많은 NIO 기능"에서 채택된 접근법입니다.
public interface Result {
String name();
String toString();
}
public enum StandardResults implements Result {
TRUE, FALSE
}
public enum WTFResults implements Result {
FILE_NOT_FOUND
}
하면 .하는 NET (NET 리플렉션).Enum.GetNames() ★★★★★★★★★★★★★★★★★」Enum.GetValues()사용하는 두 가지 특정 메서드)를 선택한 후 코드 주입을 사용하여 이러한 요소와 일부 새 요소를 사용하여 새 메서드를 만듭니다.이는 "기존 열거형에서 상속"에 대해 다소 해석적인 것으로 보입니다.
나는 다른 사람이 이것을 언급하는 것을 보지 못했지만 열거형의 순서적 값은 중요하다.예를 들어 데이터베이스에 열거형을 저장할 때 Graphes에서는 순서 값이 사용됩니다.어떤 식으로든 열거를 확장할 수 있다면 확장자의 순서 값은 어떻게 됩니까?여러 곳에 걸쳐 확장하면 어떻게 이런 서수들의 질서를 유지할 수 있을까요?순서값의 혼돈/불안정은 아마도 언어설계자들이 이것을 건드리지 않은 또 다른 이유일 것이다.
언어 디자이너라면 모든 열거값을 반환해야 하는 values() 메서드의 기능을 어떻게 유지할 수 있을까요?무엇으로 호출하고 모든 값을 어떻게 수집합니까?
enum을 추가하는 것은 소스 코드로 돌아가서 편집하는 경우 매우 일반적인 작업입니다.다른 방법(가능한 경우 상속 또는 리플렉션)은 라이브러리의 업그레이드 시 다시 나타나며 동일한 열거 이름 또는 동일한 열거 값을 도입했을 때 사용자에게 타격을 줄 수 있습니다.정수가 있는 하위 수준의 코드를 많이 보았습니다.숫자가 바이너리 인코딩과 일치하므로 문제가 발생할 수 있습니다.
이상적으로는 enum을 참조하는 코드는 equals only(또는 스위치)로 작성해야 하며, enum이 const로 설정될 것으로 예상하지 않음으로써 향후 검증이 되도록 시도해야 합니다.
기본 클래스의 의미로 확장하면 Java로 확장하면...아니요.
그러나 Enum 값을 확장하여 속성 및 메서드를 지정할 수 있습니다.
예를 들어, 다음에서는 괄호 열거를 사용합니다.
class Person {
enum Bracket {
Low(0, 12000),
Middle(12000, 60000),
Upper(60000, 100000);
private final int low;
private final int high;
Brackets(int low, int high) {
this.low = low;
this.high = high;
}
public int getLow() {
return low;
}
public int getHigh() {
return high;
}
public boolean isWithin(int value) {
return value >= low && value <= high;
}
public String toString() {
return "Bracket " + low + " to " + high;
}
}
private Bracket bracket;
private String name;
public Person(String name, Bracket bracket) {
this.bracket = bracket;
this.name = name;
}
public String toString() {
return name + " in " + bracket;
}
}
조금 전에 Java에 관한 투고를 보았습니다.http://www.javaspecialists.eu/archive/Issue161.html 를 참조해 주세요.
기존 값의 조합인 C# 열거에 값을 추가할 수 있으면 좋겠습니다.예를 들어 (이것이 내가 하고 싶은 일입니다)
AnchorStyles는 다음과 같이 정의됩니다.
public enum AnchorStyles { None = 0, Top = 1, Bottom = 2, Left = 4, Right = 8, }
Anchor Styles를 추가하고 싶습니다.BottomRight = Right + Bottom(오른쪽 + 아래쪽)을 선택합니다.
my_ctrl.Anchor = AnchorStyles.Right | AnchorStyles.Bottom;
그냥 말할 수 있어요
my_ctrl.Anchor = AnchorStyles.BottomRight;
이상과 같은 문제는 발생하지 않기 때문에 가능하다면 좋을 것 같습니다.
열거형을 상속/확장할 수 없습니다. 특성을 사용하여 설명을 선언할 수 있습니다.정수값을 찾으시는 경우 기본 제공입니다.
음-제가 아는 한, 이것은 불가능합니다.- 열거는 디자인 타임에 작성되어 프로그래머의 편의를 위해 사용됩니다.
코드가 컴파일되면 열거형 이름에 해당하는 값이 대체되어 열거형 개념이 제거되고 확장 기능이 제거될 것이라고 확신합니다.
옛날에는 나도 이런 일을 하고 싶었지만 열거형 확장자는 많은 기본 개념을 무효화한다는 것을 알게 되었다.(폴리모르피심뿐만 아니라)
그러나 외부 라이브러리에서 열거형이 선언된 경우 여전히 수행해야 할 수 있습니다. 이 열거형 확장자를 사용할 때는 특히 주의해야 합니다.
public enum MyEnum { A = 1, B = 2, C = 4 }
public const MyEnum D = (MyEnum)(8);
public const MyEnum E = (MyEnum)(16);
func1{
MyEnum EnumValue = D;
switch (EnumValue){
case D: break;
case E: break;
case MyEnum.A: break;
case MyEnum.B: break;
}
}
java에 관한 한 요소를 열거에 추가하면 서브 클래스가 아닌 슈퍼 클래스가 효과적으로 생성되기 때문에 허용되지 않습니다.
고려사항:
enum Person (JOHN SAM}
enum Student extends Person {HARVEY ROSS}
다형성의 일반적인 사용 사례는 다음과 같습니다.
Person person = Student.ROSS; //not legal
확실히 틀렸습니다.
로컬/일회성 사용을 원하는 경우 임시/로컬 회피책:
enum Animals { Dog, Cat }
enum AnimalsExt { Dog = Animals.Dog, Cat= Animals.Cat, MyOther}
// BUT CAST THEM when using:
var xyz = AnimalsExt.Cat;
MethodThatNeedsAnimal( (Animals)xyz );
언급URL : https://stackoverflow.com/questions/55375/extending-an-enum-via-inheritance
'source' 카테고리의 다른 글
| 클래스 예제의 콜어댑터를 작성할 수 없습니다.간단하죠. (0) | 2022.09.19 |
|---|---|
| jQuery를 사용하여 HTML 엔티티를 디코딩하는 방법 (0) | 2022.09.19 |
| Laravel 유효성 검사 속성 "nice names" (0) | 2022.09.19 |
| Python 클래스의 부모를 구하는 방법은? (0) | 2022.09.19 |
| POST 요청으로 JSON 데이터 Java HttpUrlConnection 전송 (0) | 2022.09.19 |