2009-07-24 84 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派生的情况。