簡體   English   中英

如何將類實例傳遞給靜態方法?

[英]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是類的實例而不是類型,因此應將其FooFoo類型並調用該函數。

更改

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM