2010-06-06 22 views
5

İki sınıfım var, bir temel sınıf ve bir alt sınıf. bunu yapmak için denemek Çocuğum sınıfta SonraGarip genericics derleme hatası

protected virtual ReturnType Create<T>() where T : ReturnType {}

:

The type 'T' cannot be used as type parameter 'T' in the generic type or method 'Create()'. There is no boxing conversion or type parameter conversion from 'T' to 'ReturnType'.

:

protected override ReturnTypeChild Create<T>() // ReturnTypeChild inherits ReturnType 
{ 
    return base.Create<T> as ReturnTypeChild; 
}

Görsel stüdyo bu garip hata veriyor taban sınıfında i genel sanal yöntemi tanımlamak Çocuğun geçersiz kılındığı yerde yan tümceleri yinelemek de bir hata verir:

Constraints for override and explicit interface implementation methods are inherited from the base method, so they cannot be specified directly

Burada neyi yanlış yapıyorum?

+0

Bu, korumalı olarak geçersiz kılınmalıdır BarChild Foo () '? Doğru isimleri verebilir misiniz? Foo ve Bar kafamı incitti. – Kobi

+0

Ve geri base.Foo BarChild() ;? – GenericTypeTea

+1

Kodunuzda her türlü sorun var (örneğin, geçersiz kılınmış yönteminizin genel parametresinde eksik, dönüş beyannızda yanlış yerlere ait parşömenler vb.). Belirgin tüm sorunların giderildiği probleminizin minimum düzeyde bir çoğaltmasını oluşturursanız, yardımcı yanıtlar almanız daha olasıdır. – kvb

cevap

3

Bu, çalışır.

public class BaseClass { 
    public virtual T Create<T>() where T : BaseClass, new() { 
    var newClass = new T(); 
    //initialize newClass by setting properties etc 
    return newClass; 
    } 
} 

public class DerivedClass : BaseClass { 
    public override T Create<T>() { 
    var newClass = base.Create<T>(); 
    //initialize newClass with DerivedClass specific stuff 
    return newClass; 
    } 
} 

void Test() { 

DerivedClass d = new DerivedClass() ; 
d.Create<DerivedClass>(); 
} 

Bunlar bazı temel C# override rules şunlardır:

The overridden base method must have the same signature as the override method.

Aynı döndürme türünü ve aynı yöntem argümanlar anlamına Sen jenerik dönüş türü yapmak zorunda kaldı.

+0

1 daha fazla zaman düzenleyebilir misiniz? Sınıfların düzgün bir şekilde formatlanması için girilmesi gerekir. AFAICT –

+0

Oops, düzeltildi. –

2

Dönüş türü, temel sınıf yönteminin dönüş türünden türetse bile geçersiz kılma, dönüş türünü değiştiremez. Igor'un yaptığı gibi bir şey yapmalı ve dönüş türünü jenerik yapmalısınız.