[英]C# Initialize abstract class like Java
在Java中,我可以擁有這樣的類:
public abstract class Button{
public abstract void onClick();
}
然后使用以下命令對其進行初始化:
Button b = new Button(){
@Override
public void onClick(){
// Things
}
}
現在有什么方法可以在C#中做類似的事情嗎?
還是我最好的選擇是使用事件?
如果要使用抽象類,則需要從該抽象類繼承另一個類,並使用它來初始化抽象類,如下所示:
public class MeSecondClass : MyClass
{
public override void OnClick(object sender, EventArgs args)
{
throw new NotImplementedException();
}
}
public abstract class MyClass
{
public abstract void OnClick(object sender, EventArgs args);
}
MyClass a = new MeSecondClass();
只適合嘗試做類似事情的其他人。 @shmosel建議使用lambda,所以這就是我所使用的。
public class Button(){
private Action _onClick;
public Button(Action onClick){
_onClick = onClick;
}
//Other method that calls _onClick()
}
//Other Class
Button b = new Button(() => {/*Do Code Here*/});
如其他答案所示,您可以執行類似的操作,但實際上問題是“應該嗎?” 答案是否定的。
事件是為此類事件創建的,因此請使用事件。 它不僅使代碼更清晰,更清晰,而且是C#開發人員將了解的一個完善的模式,因此使用它有助於代碼的可維護性。
C#與Java匿名內部類功能的可比方法是實例化動態對象並將其轉換為抽象類。 不幸的是,您必須自己實施轉換。 例:
using System;
namespace AnonymousInnerClassExample
{
class Program
{
public static void Main(string[] args)
{
Button button = Button.CreateFromDynamic(new
{
OnClick = new Action(() =>
{
Console.WriteLine("Hit OnClick");
})
});
button.OnClick();
}
public abstract class Button
{
public abstract void OnClick();
public static Button CreateFromDynamic(dynamic button)
{
return new Implementation(button);
}
private class Implementation : Button
{
public Implementation(dynamic button)
{
PrivateOnClick = button.OnClick;
}
private Action PrivateOnClick { get; set; }
public override void OnClick()
{
PrivateOnClick();
}
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.