我是C#的新手。我有一个类,其中包含一些使用求解器对象的方法。但是,对于每个方法,我需要再次创建一个求解器对象的实例来使用它。有人可以通过使用接口告诉我如何避免这样做吗? 创建一个接口不是问题,但是一旦创建它就会如何使用它?
例如: 这是我的界面,包含解算器
public interface ISolver
{
public void Solve(Solver s);
}
这是一个实现ISolver接口的方法
public void Solve(Solver s)
{
Context ctx = new Context();
ctx.MkSolver();
}
我想在一些方法中使用它(注意:我只有一个包含不同方法的单个类) 其中一种方法如下:
public void MyCheck(Expression expr)
{
BoolExpr boolVal = dispatch(expr);
Solver s = ctx.MkSolver();
Console.WriteLine(boolVal);
s.Assert(boolVal);
Console.WriteLine("\n ");
Console.WriteLine(s.Check());
Console.WriteLine(ReturnTrueFalse(s));
Console.WriteLine("\n ");
}
另一个是:
public bool isContradiction(Expression expr)
{
BoolExpr boolVal = dispatch(expr);
Solver s = ctx.MkSolver();
s.Assert(boolVal);
Status result = s.Check();
return result == Status.UNSATISFIABLE;
}
如何使用此界面停止在每个方法中使用 Solver s = ctx.MkSolver(); 。任何帮助,将不胜感激。谢谢。
答案 0 :(得分:1)
我无法通过使用界面看到你想要删除行Solver s = ctx.MkSolver()
。相反,我会将Solver
实例存储在类的成员变量中。并且可能添加一个易于使用的属性:
public class YourClass
{
private Solver _solver;
private Solver MySolver
{
get {
if (_solver == null) _solver = ctx.MkSolver();
return _solver;
}
}
// ...
您在问题中显示的代码表明ctx
可用于您的类的范围,因此我也在此属性中使用它。
您现在可以在方法中使用此属性:
public void MyCheck(Expression expr)
{
BoolExpr boolVal = dispatch(expr);
Console.WriteLine(boolVal);
MySolver.Assert(boolVal); // use property
Console.WriteLine("\n ");
Console.WriteLine(MySolver.Check());
Console.WriteLine(ReturnTrueFalse(s));
Console.WriteLine("\n ");
}
和
public bool isContradiction(Expression expr)
{
BoolExpr boolVal = dispatch(expr);
MySolver.Assert(boolVal);
Status result = MySolver.Check();
return result == Status.UNSATISFIABLE;
}