2016-03-19 15 views
-1

Kalıtım sınıfım var ve olay yönteminin argüman türünü de miras alınan bir sınıf olan farklı bir türe dönüştürmeye çalışıyorum.C# - Geçersiz kılma yönteminin bağımsız değişken türünü değiştir

orijinal sınıfları:

public class Alpha { 
    protected virtual void OnSpecialEvent(AlphaArgs e); 
} 

public class AlphaArgs { 
    public AlphaArgs (int a, object b); 

    public int A { get; } 
    public object B { get; } 
} 

Benim devralmasını sınıfları:

public class Beta : Alpha { 
    protected override void OnSpecialEvent (BetaArgs e) 
    { 
     /* Do Stuff */ 
    } 
} 

public class BetaArgs : AlphaArgs { 
    public BetaArgs (int a, object b, string c) : base (a, b) 
    { 
     /* Do Stuff */ 
    } 

    public string C { get; } 
} 

Ama hata ile sona: Ben AlphaArgs kullanırsanız

CS0115 'Beta.OnSpecialEvent(BetaArgs)': no suitable method found to override 

Ben yok Herhangi bir 'problem' ama eklemek istediğimden fazla parametreyi kaybederim.

Sana temel sınıf yöntemini geçersiz kılmak istediğinizde, ben bile için ...

cevap

0

arıyorum bilmiyorum eksik bariz bir şey var mı, sen onu geçersiz kılmak için gereken Temel sınıftaki ile aynı imza. ve ayrıca yöntemi geçersiz kılmıyorsunuz ama aşırı yükleniyor.

protected override void OnSpecialEvent(AlphaArgs e) 
{ 
    BetaArgs be = e as BetaArgs; 
    if(be != null) 
    { 
     /* Do Stuff */ 
    } 
    base.OnSpecialEvent(e) 
} 

veya tercih ederse, hem aşırı OnSpecialEvent oluşturabilirsiniz: Eğer ancak aşağıdakileri yapabilirsiniz. Daha fazla bilgi için, buradan okuyabilirsiniz. https://stackoverflow.com/a/27547235/1926877

Bu yardımcı olur umarım.

+0

: BetaArgs bir, kalıtım zinciri altındaki çünkü BetaArgs parametre OnSpecialEvent geçmek mümkün değildir? – Zuriki

0

Bunu yapamazsınız. Mümkün olsaydı, bu göz önünde bulundurun:

Beta beta = new Beta(); 
Alpha stillBeta = (Alpha)beta; // Here the compile-time type is Alpha, 
           // but the run-time type is Beta. 
AlphaArgs alphaArgs = new AlphaArgs(1,2); 
stillBeta.OnSpecialEvent(alphaArgs); // What should happen here? 

Şimdi BetaArgs bekliyor sizin Beta örneği, yerine AlphaArgs daha az türetilmiş örneği oluyor. Bu işe yaramaz - polimorfizmi kırar.

0

Jenerikler kullanabilirsiniz!

public class Alpha<T> 
{ 
    protected virtual void OnSpecialEvent(T e) 
    { 
     //do stuff 
    } 
} 

emin genel tür T AlphaArgs sınırlıdır yapmak için: yerine AlphaArgs genel bir türünü kabul böylece

public interface IBase<T> 
    { 
     void OnSpecialEvent(T e); 
    } 

    public class Alpha : IBase<AlphaArgs> 
    { 
     public void OnSpecialEvent(AlphaArgs e) 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    public class Beta : IBase<BetaArgs> 
    { 
     public void OnSpecialEvent(BetaArgs e) 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    public class AlphaArgs 
    { 
     public int A { get; } 
     public object B { get; } 
    } 

    public class BetaArgs 
    { 
     public string C { get; } 
    } 
+0

Üzgünüm, açık olmalıydım, temel sınıfları C# için yerleşik olarak düzenleyemiyorum, bu durumda BackgroundWorker. – Zuriki

0

Sen OnSpecialEvent() değiştirerek bunu başarabilirsiniz: bir göz atın Eğer türünü belirtebilirsiniz aşağıdaki gibi Beta tanımlayarak Sonra

public class Alpha<T> where T : AlphaArgs 
{ 
    protected virtual void OnSpecialEvent(T e) 
    { 
     //do stuff 
    } 
} 

: ya da (bu durumda BetaArgs) devralan başka sınıf, bir genel tür kısıtlaması ekleyin bağımsız değişkeninin Beta.OnSpecialEvent öğesine geçirilmesi. (Aslında Visual Studio Otomatik Tamamlaması, tam olarak Beta için aynı imzayı önerecektir.OnSpecialEvent) Visual Studio AutoComplete on overridden function with a generic argument

bütün kod gibi olacaktır: örneğin bir de

public class AlphaArgs 
{ 
    public AlphaArgs(int a, object b) 
    { 
     //do stuff 
    } 

    public int A { get; } 
    public object B { get; } 
} 

public class BetaArgs : AlphaArgs 
{ 
    public BetaArgs(int a, object b, string c) : base(a, b) 
    { 
     /* Do Stuff */ 
    } 

    public string C { get; } 
} 

public class Alpha<T> where T : AlphaArgs 
{ 
    protected virtual void OnSpecialEvent(T e) 
    { 
     //do stuff 
    } 
} 

public class Beta : Alpha<BetaArgs> 
{ 
    protected override void OnSpecialEvent(BetaArgs e) 
    { 
     //do stuff 
    } 
}