2011-12-19 24 views
15

I (C#), bir sınıfta bir arabirim yöntemi, arayüz tanımlanan temel tür yerine türetilmiş bir tür dönen uygulamak çalışıyorum:geçersiz kılma arabirim yöntemi dönüş türü

interface IFactory 
{ 
    BaseCar GetCar(); 
} 

class MyFactory : IFactory 
{ 
    MyCar GetCar() 
    { 
    } 
} 

class MyCar : BaseCar 
{ 

} 

Ancak, aşağıdaki hata olur: nerede, elbette

'Myfactory' arabirim üyesini uygulamıyor 'IFactory.GetCar()'. 'MyFactory.BaseCar()', IFactory.GetCar() 'öğesini uygulayamaz çünkü' BaseCar 'eşleştirme türüne sahip değil.

Bu durumun neden başarısız olduğu konusunda bana herhangi bir kimse işaret edebilir mi ve bunun için en iyi yol nasıl olurdu?

+0

Bu yinelenen bir uygulamaya: ([ “Arayüz uygulanmadı” Türetilmiş Type dönersek zaman] http://stackoverflow.com/questions/1121283/ arabirim uygulanmayan-dönüş-türetilmiş türden) ve [arabirimler tarafından belirtilen özellikler için polimorfizm] (http://stackoverflow.com/questions/3670069/polymorphism-for-properties-specified-by-interfaces) –

+0

@Austin Yorumumu kaldırdım üzgünüm .. – MethodMan

+0

Teşekkürler @cod y-gray, bir şekilde daha önce bu bağlantıları kaçırdı. – iDPWF1

cevap

16

Kullanım Jenerik

interface IFactory<T> where T: BaseCar 
{ 
    T GetCar(); 
} 

class MyFactory : IFactory<MyCar> 
{ 
    MyCar GetCar() 
    { 
    } 
} 


class MyCar : BaseCar 
{ 

} 
+0

'MyFactory'de' GetCar' public olmalı ve 'T' covariant, bu yüzden C# 4.0 kullanıyorsanız, arabirimde' out' ile işaretleyebilirsiniz. – vcsjones

+0

@vcsjones: Eğer BaseFactory IFactory 'u kullanır ve DerivedFactory BaseFactory'i alır ancak IFactory 'u kullanırsa, kovaryans kullanıldığında, IFactory olarak bir DerivedFactory kullanarak GetCar'ın DerivedFactory uygulamasını kullanmanın herhangi bir garantisi var mıdır? – supercat

4

GetCar yönteminiz, arabirimi uygulamak için BaseCar yöntemini döndürmelidir. Hatanın dediği gibi, 'yöntemin dönüş türü, arabirimin yönteminin dönüş türü ile eşleşmelidir. Yeni sınıfın yazılmış versiyonları almak istiyorsanız

BaseCar GetCar() 
{ 
    return new MyCar(); 
} 

bir alternatif, John's answer uyarınca jeneriği kullanmaktır: Eğer o dönen, MyCar bir örneğini oluşturarak durdurma şey yok

.

+1

Gerçekten atmak zorunda mısın? –

+0

İyi nokta, düzeltildi. –

+0

Bu durumda, GetCar() farklı senaryolarda, MyCar, MyOtherCar vb. Döndürmek zorunda oldukları bir çok kişi tarafından kullanıldığından, her zaman BaseCar'dan almaları gerekmeden vardır. – iDPWF1

7

Bunu gerçekleştirmek için 2 yol vardır. Jenerikler kullanabilir veya arayüz üyelerini açıkça uygulayabilirsiniz.

Jenerik

interface IFactory<T> where T: BaseCar 
{ 
    T GetCar(); 
} 

class MyFactory : IFactory<MyCar> 
{ 
    MyCar GetCar() 
    { 
    } 
} 

Açıkça üye

interface IFactory 
{ 
    BaseCar GetCar(); 
} 

class MyFactory : IFactory 
{ 
    BaseCar IFactory.GetCar() 
    { 
     return GetCar(); 
    } 

    MyCar GetCar() 
    { 
    } 
} 
İlgili konular