我有X类,它们具有不同的信息和计算方法,应该共享但可以覆盖,所以:
class Rule1 {
int type = 1;
string name = "Rule";
public float Calc()
{
return 1 + 2 + type; // SAME
}
}
class Rule2 {
int type = 2;
string name = "Rule2";
public float Calc()
{
return 1 + 2 + type; // SAME
}
}
class Rule3 {
int type = 3;
string name = "Rule3";
public float Calc()
{
return 3 + 4 + type; // DIFFERENT
}
}
我想在调用方法中写的是这样的:
class Calculator
{
public void Do(List<IRules> ruleList)
{
foreach(var rule in ruleList)
{
rule.Calc();
}
}
}
所以我的界面应该如何看起来以及如何将calc
方法抽象为默认实现但可覆盖?
如果您的实现对大多数继承者都是正确的,但不是对所有继承者都正确,请在派生类中将其标记为virtual
并override
:
public class BaseCalculation { public virtual float Calculate() { return 42; } } public class HalfCalculation : BaseCalculation { public override float Calculate() { return 21; } }
您现在可以使用基类
BaseCalculation
代替接口。如果您仍然坚持使用接口,那么仍然可以在接口中定义Calculate()
方法并将其应用于基类:
类,但是没有public interface IRules { float Calculate(); } public class BaseCalculation : IRules { // same as above
具有附加的好处,您可以将此接口应用于也计算某些内容的other
BaseCalculation
中的任何逻辑。您可以使用抽象基类和Calc
上的多态性进行尝试。
您正在搜索继承的类和虚拟方法(允许覆盖):
每个类都必须支持该接口。在每个类中实现Calc方法都不重要。它们可以相同或不同。