2014-12-20 13 views
5

Bir enum ABC ve bir sınama sınaması verdim ve doSomething'i çağırmam gerek ama ABC enum parametresi olarak geçemiyorum.Enum içinde Kalıtım

enum ABC{ 
    A,B,C; 
} 

Class Test{ 

    public void doSomething(ABC abc) 
    { 
    //some work 
    } 

} 

Burada ABC tüm üye olmalı bir enum DEF istiyorum ve aynı zamanda enum XYZ (iki çeteleler (ABC ve XYZ) üyelerini içermelidir bir enum DEF istiyorum) üyesi olmalıdır. Bunun gibi bir örnek.

enum DEF 
{ 
    A,B,C,X,Y,Z,D; 
} 

enum xyz{ 
    X,Y,Z; 
} 

Yani parametre olarak sadece ABC enum alır doSomething yöntemini çağırabilirsiniz. Ben DEF.Example

class Demo{ 

    public static void main(String[] ags) 
    { 
     Test test= new Test(); 
     test.doSomething(DEF.A); 
     } 

} 

Ben taze duyuyorum ile doSomething() yöntemini çağırmak istiyorum. Lütfen bana herhangi bir yardım veya öneri sağlayın. Size minnettar olacağım. Java

+1

Sen 'enum's uzatamaz. Ancak 'MyInterface 'arabirimini' doSomething() 'yöntemiyle yapabilir ve daha sonra' ABC' ve 'XYZ'' 'MyInterface' işlevlerini uygulayabilirsiniz. Bu şekilde, altı enum sabitlerinden herhangi birinde "doSomething()" diyebilirsiniz. –

cevap

9

Numaralamalar sen uzatamaz ve enum (Varolan enum daha fazla değer katmak olamaz), yani final bulunmaktadır. Sizde, ABC ve DEF, tamamen aynı enum öğelerinin adlarını içeren tamamen farklı varlıklardır. Bu, örneğin ABC.A != DEF.A anlamına gelir.

ancak bunların hiçbiri mükemmel veya basit, yani işlemek için birçok yol vardır. Özel durumunuzda neyin gerekli olduğunu değerlendirmelisiniz.

interface MyInterface{ 

} 

enum ABC implements MyInterface{ 
    A,B,C; 
} 

enum DEF implements MyInterface{ 
    A,B,C,X,Y,Z,D; 

} 

Bu şekilde doSomething() hem ABC ve DEF kullanabilirsiniz::

Class Test{ 

    public void doSomething(MyInterface abc) 
    { 
    //some work 
    } 

} 

Diğer bir yaklaşım

o işlemek için

İlk yolu çeteleler uzatabilirsiniz ortak bir arayüz, yaratmaktır sınıfınıza jenerik eklemek. Belirtilen enum destekleyecek somut uygulamalar oluşturabilmesi Bu şekilde:

class GenericTest<E extends Enum<E>>{ 
    public void doSomething(E enum){ 
    } 
} 

class TestWhichAcceptsABC extends GenericTest<ABC>{} 

class TestWhichAcceptsDEF extends GenericTest<DEF>{} 

Üçüncü yol

Class Test{ 

    public void doSomething(ABC abc) 
    { 
    //some work 
    } 

    public void doSomething(DEF abc) 
    { 
    //some work 
    } 

} 

fazla fikir nasıl This thread görün

ele alınması gereken her enum için, bir tane birden çok yöntem oluşturmaktır enum kalıtımını çözmek.

1

Aynı isimde bahsettiğiniz halde, enum içinde aynı anlama gelmez. ABC'daki Örnek A, ABC örneğidir. Ancak DEF'da A, DEF örneğidir. Yani farklı. Enum'da arayüz uygulayabilirsiniz.

enum ABC implements X{ 
    A,B,C; 
} 

public class Test{ 

    public void doSomething(X x) 
    { 

    } 
} 

Bunu deneyeceksiniz.

-2

Sen Çeteleler uzatamaz ancak bir enum davranışını simüle edilerek sonraki en iyi şeyi yapabiliriz. Statik değeri olan bir sınıf oluşturabilirsiniz. Bunun gibi.

public class abc extends yxz { 
    public static final int A = 1; 
    public static final int B = 2; 
    public static final int C = 3; 
}