2016-04-11 18 views
-1

aşağıdaki sınıfları:Cast nesne

class MyObject { } 
class MyObject2 { } 

interface Parent<T> 
{ 
    void DoSomething(T myObj); 
} 

class Child1 : Parent<MyObject1> 
{ 
    public void DoSomething(MyObject1 myObj) { } 
} 

class Child2 : Parent<MyObject2> 
{ 
    public void DoSomething(MyObject2 myObj) { } 
} 

Ben üst dönmek fabrika yöntemini oluşturmak istiyorum ama şu döküm hatayı olsun

dolaylı türünü dönüştürülemez ' Child1 'to' Ana '. Açık dönüştürme herhangi bir geçici çözüm bunun için var mı (bir döküm eksik?)

static Parent<object> Factory() 
    { 
     return new Child1(); 
    } 

var?

+0

'Ancak Child1'den Parent'e yayınlamaya çalıştığımda bir döküm hatası alıyorum, bu yüzden hata nedir .. döndürülecek ilgili hatayı göndermediyseniz nasıl bir şey yapmalıyız ..? – MethodMan

+0

'Parent '! = 'Üst '.Eğer “Ebeveyn” i kullanmak istiyorsanız [bazı arayüzler yaratmak zorundasınız] (http://stackoverflow.com/questions/6623188/pattern-for-exposing-non-generic-version-of-generic-interface) Jenerik olmayan bir bağlamda '. (yani, Listesinin "jenerik olmayan" IList "i nasıl uyguladığıyla benzer) –

+0

İstemciler," T "nin ne olduğunu bilmiyorlarsa, döndürülen nesneyi nasıl kullanmalıdır? – Lee

cevap

5

İstediğiniz şey mümkün değil. Bir Parent<MyObject1> ürününe Parent<object> olarak başvurmak mantıklı değildir. Bir string varsa, imzası DoSomething(MyObject1) olan bir yönteme iletemezsiniz. Yapmaya çalıştığın şeyi yapmanın başka bir yolunu bulmalısın.

public interface Parent 
{ 
    void DoSomething(object myObj); 
} 

Ve soyut sınıf gibi: orada bazı hatalar olabilir ama bildiğim kadarıyla sen bunu başarmak böylece

0

ben biraz özensiz olsa gibi bir arabirim oluşturmak, tamamen bu test etmedi

public abstract class BaseParent<T> : Parent<T>, Parent 
{ 
    public abstract void DoSomething(T myObj); 

    public void DoSomething(object myObj) 
    { 
     T obj = myObj as T; 
     if (obj != null) 
     { 
      DoSomething(obj); 
      return; 
     } 

     // Do something to handle null values, unexpected values 
    } 
} 

Soyut sınıfı uygulamak için Çocuk1 ve Çocuk2'yi değiştirin. Örneğin, "Çocuk" veya Çocuk 2'yi "Üst" olarak atayabilmeniz gerekir.

Not myObj, T değeri n değeri olan bir değer olduğunda bu durumla başa çıkılmaz, dolayısıyla boş değerleri kabul etmeniz gerekiyorsa biraz daha fazla işlem yapmanız gerekir.

(eğer doğru türde değil bir nesne iletiyorsanız gerçekleşmesi için ne gerekiyor ..., gerçekten ilk etapta bunu yapar GEREKEN eğer şüpheli değil mi?)

Bu oldukça ilginç
0

, Jenerikler ve alt sınıfların karıştırılması. Ama benim görüşüme göre, iki çocuk sınıfına ihtiyacınız yok, çünkü aslında sadece jenerik parametre tarafından farklı olan aynı sınıf. Eğer

Public static Parent<MyObject1> Factory() 
{ 
    Return new Child1(); 
} 

yazarsanız

Sonra hata uzağa gider. Esas olarak, geri dönüş tipi, fabrika yönteminin kendisi jenerik olmadığı için beton tipi olmalıdır.

Yani, genel olarak fabrika yöntemi yapmak şöyle gerekir:

Public static Parent<T> Factory<T>() { return (Parent<T>)new Child1(); } 

Aslında soyut fabrika uygulamaya çalışıyoruz, soyut fabrika nesnesi oluşturmak için iki parametre vardır, sizin durumda biridir jenerik tip ve diğeri, fabrika yönteminin nesneyi oluşturacağı parametredir. Bu yüzden soyut fabrika tasarım modeline bakmanızı öneriyorum.