2010-02-28 12 views
7

Aşağıdaki istemci kodu verildi:Bir Oluşturucu Bir Alt Sınıfa Geri Dönebilir mi?

var obj = new Class1(); 

Class1 yapıcısını değiştirmek için bir alt sınıf (veya başka bir alternatif uygulama) döndürmek için bir yol var mı?

Bazı koşullara bağlı olarak, objeden iki farklı uygulamadan birini almak istiyorum. Açıkçası, bir fabrika veya DI çerçevesini kullanarak değiştirebilirdim, ancak mümkünse istemci kodunu değiştirmekten kaçınmak istiyorum.

Cevabın hayır olduğunu varsayalım, ama bunun gerçekleşmesinin akıllıca bir yolu olup olmadığını merak ediyorum.

+4

"uzantı yeni" çağrıldığında "" operatör kullanılır. Fabrika için güzel bir sözdizimsel şeker olurdu. Bu tarz bir desenin faydalı olabileceği gerçekten harika bir senaryonuz varsa, bir örneği görmeyi çok isterim. –

+1

@Eric: Özellikle C# örneği olmasa da, bunun C++ 'da yararlı olabileceği bir durumla karşılaşıyorum. Çapraz platform kitaplığı geliştiriyorum ve platform tanımlı bir ABC örneğinin kurucusundan türetilmiş bir sınıf örneğini döndürmesi gerçekten çok yararlı olacaktır. C# ile geliştirirken benzer durumlar olması gerektiğine eminim. – Mac

+0

@Eric Lippert - Senin için gerçek bir dünya senaryom var! http://blog.hackensplat.com/2010/09/construct-something-else-c.html – billpg

cevap

4

Bu mümkün değil.

Zeki geçici çözümler arasında, kurucunun bir static işleviyle değiştirilmesi veya (tavsiye edilmez) temel sınıfın etrafındaki bir sarıcı kullanılarak değiştirilmesi ve farklı sarılmış sınıflar oluşturulması bulunur.

8

Sen parametrelere bağlı olarak fabrika yöntemi ile yapıcı değiştirin ve ne gibi dönebilirsiniz: Factory desen kontrol etmek istiyorum bu gibi şeyler için

public Class2 : Class1 {} 

public static Class1 CreateClass1(bool returnDerivedClass) 
{ 
    if (returnDerivedClass) 
    { 
     return new Class2(); 
    } 
    else 
    { 
     return new Class1(); 
    } 
} 
0

. Ayrıca, ihtiyaçlarınıza bağlı olarak, kuplajı azaltmak için genel yöntemlere bakmanızı tavsiye ederim. Sınıfın kurucusuna yapılan çağrınız, bir programda sahip olabileceğiniz en zor bağlantıdır ve kendinizi bulduğunuz gibi, uygulamayı bir güçlükten kurtarmayı sever. Okuma "kontrolden Inversion" ve "Bağımlılık Enjeksiyon" hakkında

, belki de gerçekten aranılan da budur.

Güzel kütüphane

here bulunabilir.

0

Bir enjeksiyon kitaplığı kullanın. Aşağıdaki bağlantı performansın nadiren üzerinde bir enjeksiyon kütüphane seçsin bir kriterdir büyük orada enjeksiyon kütüphanelerin listesi ve performansları

http://www.palmmedia.de/blog/2011/8/30/ioc-container-benchmark-performance-comparison

Ben ancak öneririm karşılaştırması verilmektedir, çoğu uygulama örneğini olmaz Bu adamın testlerinde kullandığı nesne sayısı. İşi iyi yapan NInject kullanıyorum, ancak başka bir projeye başlayacak olsaydım muhtemelen simpleinjector'u verirdim, NInject'de kullandığım tüm özelliklere sahip gibi görünüyor ve performans karşılaştırmalarında da başarılı oluyor. Eğer uzatma yöntemlerine kadar "yeni" operatör kullanıldığında aranmak statik fabrika yöntemi, yapmanıza izin esasen hangi

Biz bir özellik ekleme düşünen
İlgili konular