2009-08-25 24 views
5

Having şey:Bir Yöntemle Temel Sınıf Nasıl Uygulanır ve Türetilmiş Sınıfı Geçersiz Kılmaya Zorlama? Bu böyle

public abstract class AAA 
{ 
    protected abstract virtual string ToString() // Error 
    { 
    // Base Stuff 
    } 
} 

public abstract class BBB : AAA 
{ 
    public override string ToString() 
    { 
    // Use base.ToString(); 
    // More Stuff 
    } 
} 

başka yazı okuyun (abstract method in a virtual class) cadıydı oldukça benim soru gibi, ama biraz fark var. Ben AAA.ToString() bir taban davranışı ve olması için türetilmiş sınıfı geçersiz kılmak için zorlamak istiyorum.

Bunun gibi bir şey yapabileceğimi biliyorum (aşağı kaydırın) ancak uygun bir yol arıyordum.

public abstract class AAA 
{ 
    public abstract string ToString(); 
    protected string ToString2() 
    { 
    // Base Stuff 
    } 
} 

public class BBB : AAA 
{ 
    public override string ToString() 
    { 
    // Use base.ToString2(); 
    // More Stuff 
    } 
} 

Ben de muhtemelen Iaaa arabirimi yapmak ve

public class BBB : AAA, IAAA { ... } 

gibi benim BBB sınıfını oluşturmak ama bana doğru görünmüyor olabilir.

cevap

5

Kişisel yaklaşım ... esasen uygun yolu olduğunu

Düzenleme:

Sizin "şartname" dir:

  1. Varsayılan davranış
  2. Gerekli geçersiz kılma

Şimdi, uygulamanızdan beri Eğer taban sınıfı genel olarak ne yaptığını biliyorum ve türetilmiş sınıftaki doToString() için uygulanmasını sağlamak istiyorsanız kulak Eğer

public string ToString() 
{ 
    // placeholder for some default behaviour 

    string result = doToString(); 

    // placeholder for some more default behaviour 

    return result; 
} 

protected abstract string doToString(); 

Bu yalnızca işleri gerekiyor "varsayılan davranış" her zaman yürütülecek isterler. Bu Template Method tasarım deseni olarak bilinir. Eğer için bir yol arıyorsanız

AncakToString() onun uygulanmasında base.ToString() aranacak bir türetilmiş sınıfın uygulayıcısı gerektiren, daha sonra bunu yapmanın bir yolu yoktur. Geçersiz kılmaya izin vererek, türetilmiş sınıf kontrolünü uygulamaya geçirirsiniz.

Her zaman base.ToString() numaralı telefonu aramak için önerilerinizi belgeleyebilirsiniz, ancak bu konuyla ilgili.

Arabirim kullanarak sınıfınızdaki kamu sözleşmesini tanımlar. Bu, "Varsayılan" uygulamayı elde etmek için hala bir temel sınıftan türetmeniz gerektiğinden, size Şablon Yöntemi kalıbı üzerinden herhangi bir ek avantaj sağlamaz.

Temel sınıfınızda "varsayılan davranış" olarak sağlamaya çalıştığınız şey hakkında herhangi bir ayrıntı var mı? Belki de bu daha iyi bir çözüme yardımcı olur. Başvurulan soruya bakıldığında, bu aslında aynı yaklaşımdır.

+0

sayesinde Düzenlemeniz beni önemli bir şey fark ettirdi! Taban sınıfında ToString() öğesini tanımlamak ve türetilmiş sınıftaki geçersiz kılmayı zorlamak için bir mucize yol bulsaydım bile, ToString() işlevini kullanmak için geçersiz kılmanın hiçbir yolu yoktur. Ayrıca bu yazıyı bir http://social.msdn.microsoft.com/forums/en-US/csharplanguage/thread/c25b6477-b990-4284-abaf-801ddf18207c geçersiz kılma hakkında bir MVP tarafından buldum. Tekrar teşekkürler. – Tipx

+0

Hizmete sevindim. Bu yazı Marc Gravell tarafından ... O da çok iyi bilinir :) –

+0

Bu, aşağıda yayınlanan OP'lerin cevabı ile nasıl karşılaştırılır? Metot Şablonu için – Armbrat

0

Hayır, şu anda sanal bir işlevi soyut bir işleve dönüştürmek mümkün değildir. Bunu yürürlüğe koymanın tek yolu, önerdiğiniz gibi soyut olan başka bir işlev yaratmaktır. Bu tartışmalı bir yaklaşımdır (ve buna katılıyorum).

2

Sadece tam olarak istediğim davranışı elde etmek için ne öğrendim:

public abstract class AAA 
{ 
    protected abstract string ToStringSpecific(); 
    protected string ToString() 
    { 
    // Base Stuff 
    ... 
    // Use this.ToStringSpecific(); 
    } 
} 

public class BBB : AAA 
{ 
    protected override string ToStringSpecific() 
    { 
    // Specific Stuff 
    } 
} 
+0

Asıl sorunuzu düzeltmiş olmanız gerektiğini düşünüyorum ... – Armbrat

+0

Gerçekten de bu konuyu bulmasına yardımcı olabilecek soru (ve başlık) düzenleyeceğim, ancak çözümüme burada izin vereceğim. (Eğer bu şekilde yapılmasaydı, "Anwser Your Question" butonu olmaz) – Tipx

+0

Sadece yorumumun ikinci bölümünü yeniden okudum ve "kulağa" kibirli davranıyorum. Bunun için üzgünüm, demek istemedim ve yorumu değiştiremiyorum. Özür dilerim. – Tipx

İlgili konular