2013-06-20 69 views
2

如果我有一個公共方法(非靜態),我不能改變的類。
我需要添加一些我自己的方法,將使用現有的公共非靜態方法,本身內部的實例

我該如何以正確的方式做到這一點?

現在,在我自己的方法中,我創建了一個我自己的類的實例來使用其他方法,但我認爲這不是一個好方法。

例子:

class aaa 
{ 

    public string a(int i) 
    { 
    ... 
    } 
    public string b (int i) 
    { 
    ... 
    } 

    public static void x() 
    { 
    aaa myclass = new aaa(); 
    string str = myclass.a(5); 
    } 

} 
+0

爲什麼你添加的新方法不是非靜態的?另外,你確定你想創建一個實例來丟棄它嗎?這意味着其他對象的狀態沒有被真正使用,並且舊方法真的應該是靜態的,但是不是。如果狀態很重要,那麼您可能希望將該實例作爲參數傳遞。 – Servy

+0

我想直接從另一個地方訪問它們,而不需要創建這個類的實例,只需編寫aaa.x – user990635

+1

好吧,根據定義,不可能在沒有實例類型的情況下調用實例方法。這是事實。所以是的,如果你根本無法改變它,你需要在某個地方創建一個實例。 – Servy

回答

1

這聽起來像你真的希望你的實例方法是靜態的;它應該從一開始就是靜態的,因爲它不依賴於使用對象的任何內部狀態(因爲你的新方法沒有被給予,給予或重新使用該類型的任何實例)。你只是不能做出突破性的改變來使它變成靜態的,因爲在非靜態的上下文中使用它的依賴太多。

如果即使它在邏輯上不能將方法更改爲靜態,那麼您的解決方案確實是您可以在此情況下執行的最佳解決方案。它本質上是在非靜態方法中創建一個靜態「窗口」。

+0

Tnx的反饋:)最終我花了很多時間來改變所有的依賴關係等靜態的一切,因爲我真的不想保留我以前的解決方案,而其他解決方案似乎都不如我在開始時所做的更好...... – user990635

0

調用非靜態方法,你必須類,你要調用哪一個實例方法的實例。因此,您不能更改類aaa,那麼您只能將其擴展爲extension methods或繼承該類。下面是擴展方法示例:

public static class MyExtensions 
{ 
    public static void x(this aaa myClass) 
    { 
     // use public methods of class you are extending 
     string str = myclass.a(5); 
    } 
} 

可以執行x方法類似myClass實例的正常方法:

aaa myclass = new aaa(); 
myClass.x(); // you extension 

BTW在C#中,我們使用的類和方法PascalNames。

+0

這可能是這種情況,如果他將它作爲參數傳入,但他不是。也請注意,它並沒有真正改變任何東西,它只是給出了作爲實例成員的錯覺*他真正需要的是讓實例方法成爲靜態而不是靜態方法實例方法 – Servy

+0

@Servy抱歉,沒有得到你。他沒有傳遞'myClass'作爲參數。他試圖將其稱爲公共方法。或者我在這裏錯過了什麼? –

+0

如果您暫時忘記了擴展方面(因爲它只是它的樣子,而不是它的作用),所以建議爲'aaa'類型的方法添加一個新參數。從我能收集到的信息來看,這是* *不是一個參數。他不希望*傳入一個,也不希望該方法看起來像實例方法。無論如何,這是我對這個問題的解釋。 – Servy

0

這是繼承變得有用的地方。這在c#中的語法是:

public class myClass : aaa 
{ 

然後,你所要做的就是把你的方法放在這個類中。其他方法也會起作用。

+0

我從中獲得什麼?無論如何,一切正常,我只是尋找一個更「正確」的方式 – user990635

0

兩個選項:

不要寫靜態方法:

class Other { 
    private aaa _MyClass = new aaa(); 
    public void x() { 
    string str = _MyClass.a(5); 
    } 
} 

申報AAA級的靜態實例:

static aaa s_MyClass = new aaa(); 
public static void x() { 
    string str = s_MyClass.a(5); 
} 
3

我覺得你的設計是不完全正確的,但如果你不能改變你的設計這可能會訣竅。儘管我也認爲這種工作方式並不是正確的方法。

public class MyClass 
{ 
    public string MethodA(int i) 
    { 
     return StaticMethodA(i); 
    } 

    private static string StaticMethodA(int i) 
    { 
     return String.Format("i is {0}", i); 
    } 

    public static void MethodX() 
    { 
     string str = StaticMethodA(5); 
    } 
} 

現在,你就可以做到:

的擴展方法
MyClass mc = new MyClass(); 
string str = mc.MethodA(3); 

//or 

MyClass.MethodX(); 
0

確切使用案例恕我直言。

您需要將行爲(新方法)附加到已關閉的類右側。所以只是去:

class aaa 
{ 
    public string a(int i) 
    { 
    ... 
    } 
    public string b (int i) 
    { 
    ... 
    } 
} 

static class ExtensionContainer 
{ 
    public static void x(this aaa myclass) 
    { 
    string str = myclass.a(5); 
    } 
} 

擴展方法(S)將調用就像實例方法,所以調用者提供所需要的,你需要使用的功能的對象。

如果您確實需要將新方法設爲靜態 - 這只是一個巨大的代碼異味。靜態方法更接近純函數 - 並使用內部有狀態對象來實現?

如果它不是一個糟糕的設計的標誌,我不知道這個簡化,只需製作一個類的單例(aaa)並使用該對象來實現該方法。