C# 是否有理由在接口中声明可选参数?
您可以在接口方法中声明可选参数,但不需要实现类将参数声明为可选参数,如下所示。相反,可以在实现类中将参数声明为可选参数,但在接口中不能 那么,有没有理由在接口中声明可选参数呢?如果没有,为什么允许这样做 示例:C# 是否有理由在接口中声明可选参数?,c#,c#-4.0,optional-parameters,C#,C# 4.0,Optional Parameters,您可以在接口方法中声明可选参数,但不需要实现类将参数声明为可选参数,如下所示。相反,可以在实现类中将参数声明为可选参数,但在接口中不能 那么,有没有理由在接口中声明可选参数呢?如果没有,为什么允许这样做 示例: public interface IService1 { void MyMethod(string text, bool flag = false); } public class MyService1a : IService1 { public void MyMeth
public interface IService1
{
void MyMethod(string text, bool flag = false);
}
public class MyService1a : IService1
{
public void MyMethod(string text, bool flag) {}
}
public class MyService1b : IService1
{
public void MyMethod(string text, bool flag = true) { }
}
public interface IService2
{
void MyMethod(string text, bool flag);
}
public class MyService2b : IService2
{
public void MyMethod(string text, bool flag = false) { }
}
它很有用,因为接口可以按照它想要的方式声明它们,因此您可以在创建接口时获得您想要的确切灵活性。换句话说,派生类中的实现者可以根据需要将参数设置为可选的、必需的等等。如果它不是可选的,则派生类必须具有它
上面的示例显示了派生类的灵活性。这样做的原因是,当调用方拥有的编译时类型只是接口时,调用方可以更容易地使用它:
public void Foo(IService1 service)
{
service.MyMethod("Text"); // Calls MyMethod("Text", false)
}
调用方只知道某个实现的接口而不知道具体类型是很常见的,因此如果您认为可选参数是一个好主意(这是有争议的)将它们放在接口上和放在具体类型上一样有意义。接口设计者对默认参数的假设可能与实现者的设计不同 默认参数由编译器简单地展开,并由实际的默认值替换 当您对作为接口实例的对象调用方法时,编译器将替换接口上指定的默认值 当您对类的实例对象调用方法时,编译器将替换类上指定的默认值 示例:
public interface IService1
{
void MyMethod(string text, bool flag = true);
}
public class MyService1a : IService1
{
public void MyMethod(string text, bool flag) { }
}
用法:
IService1 ser = new MyService1a();
ser.MyMethod("A");
传递给
MyService1a
的第二个参数将是true
,作为接口中的默认参数。如果一个接口的设计方法Foo
采用参数Bar
,99%(但不是100%)对Foo
的调用为Bar
传递零,则必须: