这是我的工厂方法模式的代码
public abstract class TestAbstract
{
public abstract void MainFunc();
}
public class ClassA : TestAbstract
{
public override void MainFunc()
{
//code for line 1
//code for line 2
//...
Func1();
Func2();
//code for line 10
}
private void Func1() { }
private void Func2() { }
}
public class ClassB : TestAbstract
{
public override void MainFunc()
{
//code for line 1
//code for line 2
//...
Func1();
Func2();
//code for line 10
}
private void Func1() { }
private void Func2() { }
}
目前,ClassA和ClassB中的函数MainFunc都有几行相同。而且我不想在这些类中重复代码。我将MainFunc移动到TestAbstract类但它没有用。
我想要的是如何为两个类只有一个MainFunc,它可以在每个类中调用2个函数Func1和Func2。
非常感谢。
答案 0 :(得分:2)
你的意思是template method pattern吗?如果我理解正确,请尝试以下操作,并在子类中将Func1和Func2作为覆盖。
public abstract class TestAbstract
{
public void MainFunc(){
//code for line 1
//code for line 2
//...
Func1();
Func2();
//code for line 10
}
protected abstract void Func1();
protected abstract void Func2();
}
要使MainFunc调用Func1和Func2,它需要知道它们存在。
答案 1 :(得分:2)
这称为“模板方法模式”。 MainFunc可以存在于抽象类中,并调用专门用于派生类的方法Func1和Func2。
public abstract class TestAbstract
{
public void MainFunc()
{
//common code
Func1();
Func2();
}
// you can make these protected instead of public
// if they are not meant to be called directly outside of your
// derived classes
public abstract void Func1();
public abstract void Func2();
}
public class ClassA : TestAbstract
{
public void Func1()
{ //... logic for ClassA
}
public void Func2()
{ //... logic for ClassA
}
}
答案 2 :(得分:1)
您可以将MainFunc
移至TestAbstract
,但您必须将Func1
和Func2
声明为抽象函数。
答案 3 :(得分:1)
在这个例子中,ClassA只是从TestAbstract执行Func1和Func2,ClassB会覆盖这些函数。请注意base.MainFunction
,因为您需要覆盖MainFunction
void Main()
{
ClassA a = new ClassA();
a.MainFunc();
}
public class TestAbstract
{
public virtual void MainFunc()
{
Func1();
Func2();
}
public virtual void Func1() { "func1".Dump();}
public virtual void Func2() { "func2".Dump();}
}
public class ClassA : TestAbstract
{
public override void MainFunc()
{
//code for line 1
//code for line 2
//...
base.MainFunc();
//code for line 10
}
}
public class ClassB : TestAbstract
{
public override void MainFunc()
{
//code for line 1
//code for line 2
//...
base.MainFunc();
//code for line 10
}
public override void Func1() { "func1".Dump();}
public override void Func2() { }
}
答案 4 :(得分:0)
abstract
,那么而不是使用virtual
使用MainFunc
作为MainFunc