2016-04-02 16 views
1

Bu kötü bir şekilde ya da arama yeteneğine sahip olsaydı, bu konuda bir şey bulamadım ve neredeyse tamamen kendime öğrettim.Bir nesneyi aynı yöntem içinde 2 farklı şey olarak dökmek mümkün mü?

Entity sınıfı ve birden fazla alt sınıf var, Building ve Creature burada ilgili olanlardır.

Building ve Creature sınıfları için kullanmak istediğim bir setTarget(Entity e) yöntemine sahibim, çünkü bu düzeyde aynıdır.

Aynı koda sahip 2 tam yöntem oluşturmak yerine, ne tür bir türe bağlı olarak Building veya Creature ya da bir e basmanın mümkün olup olmadığını merak ediyorum.

private void setTarget(Entity e) { 
    if (e.getType.equals("Creature")) { 
     Creature c = (Creature)e; //rest of code assumes c is now a creature rather than a building 
    } 
} 

ben Entity sınıfında hedef mekaniği koyarak bunu yapabileceğini fark ama sonra o kodu/hedefleriniz gerekmez tüm diğer alt sınıflara alakasız olurdu.

Her türlü yardım veya ipucu için şimdiden teşekkür ederiz.

DÜZENLEME: Ben instanceof baktım ve kesinlikle kod biraz temizler ama kimse ne demek istediğimi anlamaya;

private void setTarget(Entity e) { 
    if (e instanceof Creature) { 
     Creature c = (Creature)e; 
    } else if (e instanceof Building) { 
     Building c = (Building)e; 
    } 
    //Building OR Creature code here ie; 
    c.setTarget(); 
} 

Bu mümkün mü?

+0

görünüyor sıklığıdır. Polimorfizm kullanıyorsanız, bu kolayca elde edilebilir. –

+1

Tüm bu kodu neden tek bir satıra koydunuz? Okumak imkansız. –

+0

'if' ifadenizde 'e.getClass(). Equals (Creature.class)' veya 'instanceof Creature 'öğesini kullanabilirsiniz. – Majora320

cevap

1

Java anahtar sözcüğünü instanceof veya getClass() kullanabilirsiniz. Bu ikisi arasındaki fark, dersem mySmallBuilding.getClass().equals(Building.class) yanlış dönecektir oysa bir SmallBuilding üzerinde getClass() çağıran bir Building 'ın sınıfında farklı bir Class nesneyi döndürür çünkü, bir sınıf SmallBuilding alt sınıfları Building ardından mySmallBuilding instanceof Building, gerçek dönecektir olmasıdır. Bunu söyledikten sonra, instanceof'u sizinki gibi alt-sese bağımlı programlarda kullanmanız ve equals() yöntemini (örneğin her iki nesnenin aynı sınıfta olması gerektiği için) getClass() kullanmanız önerilir.

private void setTarget(Entity e) { 
    if (e instanceof Creature) { 
     Creature c = (Creature)e; 
     // Creature-specific code here 
    } else if (e instanceof Building) { 
     Building b = (Building)e; 
     // Building-specific code here 
    } 
    // Could add an else for other Entity subclasses (might throw UnsupportedOperationException) 
} 

Düzenleme: İşte bu işe nasıl bir örnek

private void setTarget(Entity e) { 
    if (e instanceof Creature) { 
     Creature c = (Creature)e; 
     c.setTarget(); 
    } else if (e instanceof Building) { 
     Building b = (Building)e; 
     b.setTarget(); 
    } 
    // Could add an else for other Entity subclasses (might throw UnsupportedOperationException) 
} 

Sen olması var : Sorunuzun yapılan düzenleme doğrultusunda, böyle bir şey yapabileceğini Hem if ifadelerinde setTarget(). Başka bir seçenek aynen böyle setTarget() için bir arayüz tanımlamak olacaktır: o zaman

public interface Targetable { 
    public void setTarget(); 
} 

Ve Building ve Creature impliment Targetable var.

private void setTarget(Targetable t) { 
    t.setTarget(); 
} 

Veya: Daha sonra sıra setTarget() tanımlayabilir

private void setTarget(Entity e) { 
    if (t instanceof Targetable) { 
     ((Targetable)t).setTarget(); 
    } 
} 
+0

Tamam, şu an kullandığım şekliden daha güzel bir şekilde yapıyor, teşekkürler. – Flash

+0

@Flash Sorununuzu çözmenize yardımcı olacağını düşündüğüm bir düzenleme yapıldı. – Majora320

+0

Daha önce hiç bir arayüz kullanmamıştım ama yapmak istediğim gibi görünüyor, nasıl çalıştığına bakacağım! Çok teşekkürler! Henüz bu yazıyı bilmediğim için özür dilerim – Flash

2

Neden Creature ve Building arasında ayrım yapmak gerekir?yöntem setTarget() içerir ve Creature ve Building tarafından uygulanmaktadır

ben muhtemelen (daha iyi bir adla ya da bir şey) bir arayüz Targetable yaratacak.

Eğer Creature ve Building (ve belki de daha ileride sınıflar) sorgulamak gerekmez ancak yalnızca, e instanceof Targetable kontrol Bu tip arayüz için döküm ve üzerinde setTarget() çalıştırmak setTarget(Entity e) senin yönteminde Bu şekilde.

Not: instanceof kullanarak ve döküm ihtiyacı kodunuzu optimal şekilde yapılandırılmıştır olmayan bir göstergesi ... Bir Fabrika Desen istedikleri gibi

+0

Cevapladığım "Targetable" ı düzenlediğimde, bunu yayınladınız ... – Majora320

+0

@ Majora320: Haha, "Targetable" gibi görünüyor; -) Cevabımı hala tutacağım, belki de farklı ifadelerden dolayı daha iyi anlayan birine yardımcı olabilir. Yardım etmese bile zarar vermez: -P – siegi

+0

Hem siz hem de Majora320 bir arabirimi uygulamaya koymanın yoludur, ben de buna bakıyorum. Maalesef asla bitmeyen ve onlar olmadan devam etmeye çalışan youtube eğitimlerini takip ediyorum. Evet, kodum muhtemelen çok iyi yapılandırılmış değil ama bunun için ne yapabileceğimi bilmiyorum. – Flash

İlgili konular