SORU
4 EYLÜL 2009, Cuma


Ne'in statik için doğru alternatif yöntem miras?

Statik yöntem miras C desteklenmeyen ben de anlayalım. Ben de okumak sayıda tartışmalar (burada dahil) olan geliştiriciler iddia bir ihtiyaç için bu işlevi, hangi tipik tepkisi "eğer ihtiyacınız statik üyesine miras, bir kusur olarak tasarım".

TAMAM, OOP beni bile statik miras düşünmek istemiyor göz önüne alındığında, bunun için belli benim ihtiyacım tasarımımda bir hata için puan sonuçlandırmak zorundadır. Ama, sıkıştım. Bana yardım edecek kimse de bu hadiseyi memnun olurum. İşte meydan ...

Biraz karmaşık başlatma kodu kapsüller soyut temel sınıf (hadi bir Meyve Ara) oluşturmak istiyorum. Bu kod bazı sanal yöntem çağrıları üzerinde durulacaktır beri yapıcı yer olamaz.

Meyve her fabrika standart bir yöntem göstermek gerekir diğer beton sınıfları (Elma, Portakal), Createınstance tarafından devralınacaktır() ve örneğini başlatmak.

Eğer statik üyesine miras mümkün olsaydı, temel sınıf fabrika yöntemi, yeri ve somut bir örneği başlatılmalıdır türü elde etmek için türetilmiş bir sınıf sanal bir yöntem çağrısı kullanırdım. İstemci kodunu basit bir Apple çağır.() Createınstance tam olarak başlatılmış Apple bir örneği elde etmek için.

Ama belli ki bu mümkün değil, biri benim tasarımı değiştirmek için aynı işlevselliği ihtiyaçlarını karşılamak için nasıl açıklayabilir.

CEVAP
4 EYLÜL 2009, Cuma


Bir fikir:

public abstract class Fruit<T>
    where T : Fruit<T>, new()
{
    public static T CreateInstance()
    {
        T newFruit = new T();
        newFruit.Initialize();  // Calls Apple.Initialize
        return newFruit;
    }

    protected abstract void Initialize();
}

public class Apple : Fruit<Apple>
{
    protected override void Initialize() { ... }
}

Ve bu şekilde arayın:

Apple myAppleVar = Fruit<Apple>.CreateInstance();

Ekstra bir fabrika sınıfları gerekli.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Doc Adams

    Doc Adams

    20 HAZİRAN 2007
  • SuicideSheeep

    SuicideSheee

    8 Ocak 2012
  • Tome Rodrigo

    Tome Rodrigo

    9 Temmuz 2006