将派生类的方法重构为公共基类的方法? (C#)

时间:2009-07-24 18:48:51

标签: c# refactoring

在我的项目中,我在派生类中有一些函数是相同的,除了一个不同的部分。

我想将方法​​提升到基类。

函数看起来像这样:

func(parameters)
{
//COMMON BITS

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

//COMMON BITS
}

其中不同函数的中心线看起来都像上面一样,但“someVar”的值不同,“variable = line”中的变量不同。格式。

这是一般化形式:

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

我的想法是将函数发送给Dictionary<string CommandName, ref string> ...但是我似乎无法在其中创建带有ref字符串的字典...

然后我会删除'变量'的布尔情况,方法是将它们替换为值为“true”或“false”的字符串版本。

有更好的方法吗?

3 个答案:

答案 0 :(得分:4)

更好的方法是在virtual中调用的基类中定义abstract(或func)方法。然后在每个子类中,您可以使用特定指令覆盖该方法,func将使用子类的行为。

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

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

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

答案 1 :(得分:0)

您应该在基类上创建一个可覆盖的方法:

abstract func(parameters);

在派生类上实现它:

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

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

等等。

答案 2 :(得分:0)

如果我理解你正在尝试做什么,你可以减少

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

下至:

if (activeCommand is CommandType ) { /*logic, cast if necessary*/ }

当你有一个带基类的函数但是为派生类型执行特殊情况时非常有用。这也可以处理另一种类型派生自CommandType的情况。