2009-03-09 33 views
1

Böyle bir şey var:Genel soyut sınıf nasıl geri dönülür?

onların construstors özeldir çünkü bu sınıflar başlatılamaz yüzden böyle yapamaz çok önemlidir
abstract class BaseClass<T> 
{ 
    protected BaseClass(){} 
} 

class Class1 : BaseClass<Class1> 
{ 
    public static Class1 Instance = new Class1(); 
    private Class1(){}   
} 

class Class2 : BaseClass<Class2> 
{ 
    public static Class2 Instance = new Class2(); 
    private Class2(){}  
} 

... 
public BaseClass<T> Method<T>(int z) where T: BaseClass<T> 
{ 
    switch(z) 
    { 
     case 1: 
      return Class1.Instance; 
     case 2: 
      return Class2.Instance; 
    } 
} 

public BaseClass<T> Method<T>(int z) where T: BaseClass<T>,yeni()

nasıl özet sınıfını dönüş türü olarak kullanabilir miyim? Sadece bunu başaramıyorum. Burada herhangi bir assisstance için teşekkür ederiz.

+0

Gerçek şu ki, "Yöntem", fabrika yöntemi gibidir ... bütün bağımlılık biraz karmaşıktır ve mümkün olduğunca basit bir iskelet yayınladım. Bu sorun, Class1.Instance deyimine dönemediğim için Class1.Instance deyimini döndüremediğim için ortaya çıkıyor. BaseClass

cevap

0
abstract class BaseClass<T> 
{ 
    public abstract T Instance { get; } 

    protected BaseClass(){} 
} 

belki? Sen zaten yapmaya çalıştıkları şey ... Ben ne yapmaya çalışıyoruz bile mümkündür sanmıyorum ... Biraz daha dikkatlice bakıldığında İnanıyorum statik şeyler ...


devralamaz ?


Tip kısıtlaması, bir tür kısıtlamadır. Tür kısıtlamasını yöntem türünde değiştirmeye çalışıyorsunuz. Açıkçası işe yaramadı ve çalışmaz. Sanırım sorununa saldırmanın farklı bir yolunu düşünmelisin. Ne olursa olsun ...

+0

türüne dönüşülemiyor Bu, bir nesnenin örneğini oluşturmadan Instance özelliğini nasıl çağırıyor? –

+0

iyi, iyi nokta: p ama statik şeyleri devralamasın.Ama bu durumda, neden ilk etapta bu statik özellikler üzerinden yapması gerekiyor? – Svish

0

factory pattern'a bir göz atın. Fabrikanız, örneği almak için üzerinde bir yönteme sahip olabilir. İlk kez çağrıldığında, örnek oluşturur. Sonraki aramalarda, önceden oluşturulan örneği döndürebilir.

2

Bana yöntemin jenerik olamayacağı gibi geliyor. Örneğin, ne olacağını aradım eğer:

BaseClass<Class1> foo = Method<Class1>(2); 

, gerçeğin tek bir noktadan ihtiyaç - tipi argüman, ya da normal argüman ya. Jenerik olmayan bir taban sınıfına sahip olmanın yöntem argümanını yapabilirsiniz (varolan temel sınıfı jenerik olmayan hale getirerek ya da bunun için genel olmayan bir temel sınıf oluşturarak). Bu jenerik olmayan taban sınıfına Method dönüş türünü değiştirin.

+0

"Hakikatin tek noktası" ... Ben bunu seviyorum . –

İlgili konular