2013-06-18 18 views
7

Queue ve Map'u uygulayan bir sınıf oluşturmaya çalışıyorum. Her iki arayüzler, ancak farklı dönüş türleri ile remove(Object) yöntemi tanımlar: KUyumsuz Arabirimler Uygulamak

public interface Collection<E> { //Queue extends Collection, which has the problem method 

    public boolean remove(Object e); 

    //... 
} 

public interface Map<K,V> { 

    public V remove(K key); 

    //... 
} 

public class QueuedMap<K,V> extends AbstractMap implements Queue { 

    public V remove(K key) {/* ... */} 
    //ERROR: V is not compatible with boolean 

    //... 
} 

tip silme, bu iki yöntem imzaları çarpışacak neden olmaktadır. Onlardan birine sahip olamam çünkü geçersiz bir geçersiz kılma ve ikisi de aynı imzaya sahip oldukları için sahip olamıyorum. Bu iki arayüzün bir arada var olmasının bir yolu var mı?

+0

manşon kapalı, bana mümkün görünmüyor. –

+0

Sınıfınız hangisini kullanacağınıza karar verir, eğer siz (anahtar) kaldırmak isterseniz? –

+0

[İyi görünmüyor] (http://stackoverflow.com/questions/573621/is-the-c-sharp-explicit-implementation-of-the-interface-present-in-java) –

cevap

4

Bu özel durumda bunun mümkün olduğuna inanmıyorum. Her iki sınıf da Nesne türlerini döndürdüğünüzde bir şansınız olur, ancak temel ve nesne türlerini karıştırdığınızdan, her iki arabirimi de destekleyen herhangi bir uyumlu tür yoktur. Uyumlu olan uygun arayüzleri uygulamak, daha sonra bir iç yapıyı saklamak için kompozisyon kullanmak ve fonksiyon çağrılarını gerektiğinde haritalamak farklı bir yaklaşım olabilir. Bu, her iki arayüz olarak da tatmin olmanıza ya da kullanılabilir olmanıza gerek olmadığını, özellikle de ortaya çıkarmanız gereken şey olduğunu varsaymaktadır. Ancak, bu sınıfı iki uyumlu olmayan arabirim olarak değiştirilebilmeniz gerekiyorsa, bu yapılamaz.

0

Kendi arabiriminizi MyQueue'yu, Queue'nin çıkarma yöntemini eksi olarak kullandığı tüm yöntemlerle yapabilir ve kullanabilirsiniz. Nesneyi sıraya dönüştüren MyQueue arabirimine Queue toQueue() yöntemini verebilirsiniz.

Bu dönüştürme işlemi, her bir yöntem için X'in this. [X] numarasını çağırması/döndürmesi gereken bir anonim Queue'un yeni bir örneğini döndürmeyi içerebilir. Kaldırma yöntemi için this.remove()'u arayacaksınız, ancak this.remove() çağrısının dönüş değeri yerine bir boole döndürün.

+0

Bu olası değildir. Bir işe yara. "Java.util.Queue" uygulamasının amacı, bu sınıfın örneklerinin bir "java.lang.Queue" olmasını bekleyen yöntemlere geçirilebilmesidir. MyQueue’yu uygulamak bunu gerçekleştirmeyecek. –

+0

@AndrzejDoyle Katılıyorum, ama bu çözümün OP'nin kullanım durumu için işe yarayacağını ya da daha fazla tartışmayı yayınlayacağına karar verdim. –