2009-07-24 52 views
1

在我的項目中,我在派生類中有幾個函數是相同的,除了每個部分不同。重構派生類的方法到共同基類的方法? (C#)

我想將方法​​拉到基類。

的功能是這樣的:

func(parameters) 
{ 
//COMMON BITS 

if  (someVar == "value1") { htmlFilename = line; } 
else if (someVar == "value2") { subVideoLink = line; } 
else if (someVar == "value3") { linksH2HeadingWritten = true; } 

//COMMON BITS 
} 

其中的不同功能的中心行中的所有像以上但對「someVar」,並在不同的變量不同的值「變量=線;」格式。

這是一般形式:

if (someVar == "CommandName") { variable = line; } 

我當時的想法是送功能Dictionary<string CommandName, ref string> ...但似乎我無法作出解釋,在其參考串...

然後,我會通過用值爲「true」或「false」的字符串替換「變量」的布爾情況。

有沒有更好的方法來做到這一點?

回答

4

更好的方法是在func中調用的基類中定義virtual(或abstract)方法。然後在每個子類中,您可以使用特定指令覆蓋該方法,func將使用該子類的行爲。

public class MyBase 
{ 
    protected virtual void DoCommand() { throw new NotImplementedException(); } 

    public void Func() 
    { 
     ... 
     DoCommand(); 
     ... 
    } 
} 

public class MySubClass : MyBase 
{ 
    protected override void DoCommand() 
    { 
     ... 
    } 
} 
+0

啊......我明白你在說什麼了。謝謝,我會嘗試。 – 2009-07-24 19:16:46

+0

而不是扔在基地,爲什麼不把它標記爲抽象? – 2009-07-24 19:22:48

0

你應該在基類中創建一個重寫的方法:

abstract func(parameters); 

並執行它的派生類:

class CommandN { 
... 
func(parameters) 
{ htmlfilename = line; } 
} 

class CommandSubVideoLinkX { 
... 
func(parameters) 
{ subVideoLink = line; } 
} 

等。

+0

Command類不是派生類,這些函數在......對不起,我沒有說清楚。 – 2009-07-24 19:07:55

0

,如果我理解你想要正確地做什麼,你可以減少

if (activeCommand.GetType().Name == "CommandName") { variable = line; } 

下到:

if (activeCommand is CommandType) { /*logic, cast if necessary*/ } 
當你有一個函數,它

非常有用的基類,但爲派生類型執行特殊情況。這也將處理其他類型從CommandType派生的情況。

相關問題