[英]How to pass class instance to a static method?
我實際上是通過創建以下代碼來實現的:
class Foo{
public void test(){
Keyboard.input(this);
}
public void menu(){
Console.WriteLine("This is a menu");
}
}
class Keyboard{
public static string input(object class_name){
new class_name().menu(); //call from dynamic object the method
}
}
可以看到,我有一個名為Foo
的類,其中包含方法test
,該方法從用戶鍵盤讀取一些輸入,從本質上講,該方法使我可以識別用戶是否按了特定的鍵,從而調用了方法菜單。 在此示例中,它僅稱為方法menu
。 現在,我將Foo
類的實例傳遞給Keyboard
類,該類具有一個名為input
的靜態方法,該方法應創建所傳遞類的新實例並調用menu
方法。 但是我實際上在這條線上有一個錯誤:
new class_name()
object是一個對象,但用作類型
我做錯了什么?
由於class_name
是類的實例而不是類型,因此應將其Foo
為Foo
類型並調用該函數。
更改
new class_name().menu();
至
((Foo)class_name).menu();
更新
如果希望將其用於多個類,則應創建一個接口以使它們繼承。
// All classes passed into 'Keyboard.Input' should inherit this interface
interface IMenu
{
public void menu();
}
class Foo : IMenu
{
public void test()
{
Keyboard.input(this);
}
public void menu()
{
Console.WriteLine("This is a menu");
}
}
並從改變線
public static string input(object class_name)
{
new class_name().menu(); //call from dynamic object the method
}
至
public static string input(IMenu class_name)
{
((IMenu)class_name).menu();
return "Something you want to return";
}
您需要使用具有new
約束的通用方法,並在基本抽象類中選擇menu
方法:
public abstract class MenuClass
{
public abstract void menu();
}
class Keyboard
{
//if you can pass class name
public static string input<TClassName>() where TClassName : MenuClass, new()
{
new TClassName().menu();
}
//if you can not pass class name
public static string input<TClassName>(TClassName obj) where TClassName : MenuClass, new()
{
new TClassName().menu(); //if you want to create new instance
obj.menu(); //if you want to use already existing object
}
}
如果可以傳遞必需的類名,則可以使用第一種方法,如果不能,則可以使用-不帶通用參數的第二種方法:
Keyboard.input(yourObj);
編譯器將從使用情況中自動獲取類型參數
UPDATE
由於沒有抽象類或接口,因此應在調用方法之前將對象強制轉換為必需的類:
public static string input(object class_name){
if (class_name as Foo != null)
{
((Foo)class_name).menu();
}
}
或者如果您不知道對象的輸入類型並且不能使用泛型,但是您應該創建同一類的新實例,請使用反射:
public static string input(object class_name){
if (class_name != null)
{
Foo newObj = Activator.CreateInstance(class_name.GetType());
newObj.menu();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.