用c#定义带有不同参数的接口方法
本文关键字:参数 接口 方法 定义 | 更新日期: 2023-09-27 18:06:14
interface parentInterface
{
public String methodA(/*define parameters name and dataType*/);
}
和
public class childA : parentInterface
{
public String methodA(String a, int b, String c, long d){}
}
public class childB : parentInterface
{
public String methodA(int e, String f, String g){}
}
我想定义接口方法的参数名称和数据类型
新建参数
这通常可以通过使用class
或struct
作为单个参数而不是内置类型来解决。
当class
实现了熟悉的interface
时,您知道它会带来什么。我们知道所有实现IEnumerable
接口的类都可以在foreach
循环中使用。按照惯例,接口的名称是"I",后面跟着一项能力的描述。名称通常以后缀"-able"结尾。
可…,后缀构成形容词,意义:
,,,,,,1,-可以计算的。
,,,,,,2,—具有舒适的品质。
《牛津英语词典》
让我们重命名parentInterface
和MethodA()
,以给出一个清楚的例子,说明这通常是如何工作的(并避免负面制裁):
public interface ITreatable
{
Treatment GetTreatment();
}
嗯,即使object
代表一种可治疗的疾病,找到治疗方法可能并不那么容易。下面是一些例子:
public class TheFlu : ITreatable
{
public Treatment GetTreatment(int year)
{
// return some object, Treatment, based on the flu season.
}
}
public class Hangover : ITreatable
{
public Treatment GetTreatment()
{
return Treatment.Empty; // no parameters necessary.
}
}
public class Insomnia : ITreatable
{
public Treatment GetTreatment(FamilyHistory occurances, LabResult lab)
{
// return Some Treatment object that can be different based on the
// calculated risk from the arguments.
}
}
我们真正错过的是什么
我不懂生物学,但概念还是一样的。你有一组ITreatable
疾病对象,需要有一个GetTreatment()
方法;然而,他们使用不同的标准进行计算。我们需要Symptoms
。
public class Symptoms
{
public FamilyHistory History;
public DateTime Time;
public LabResult Lab;
public BloodTest BloodTest;
public TimeSpan SymptomTime;
public IsCritical IsCritical;
}
现在,对象可以用它们自己的方法解析症状,我们的接口将如下所示:
public interface ITreatable
{
Treatment GetTreatment(Symptoms symptoms);
}
你有两个不同的方法
public String methodA(String a, int b, String c, long d){}
和
public String methodA(int e, String f, String g){}
,分别代表对childda和childdb的两个不同契约。您不能用一个同时符合两个定义的methodA
来定义一个接口。你想做的事是不可能的。
请注意,您可以在接口中定义这两个重载,但是实现该接口的每个类必须实现这两个重载。
您可以使用带有可变数量参数的接口方法,使用params
关键字。但是随后需要将每个参数强制转换为适当的类型,这有点容易出错。
public interface IFoo
{
void DoWork(params object [] arguments);
}
public class Foo : IFoo
{
public void DoWork(params object [] arguments)
{
string a = (string)arguments[0];
int b = (int)arguments[1];
string c = (string)arguments[2];
long d = (long)arguments[3];
Console.WriteLine("a={0}, b={1}, c={2}, d={3}", a,b,c,d);
}
}
public class AnotherFoo : IFoo
{
public void DoWork(params object [] arguments)
{
int e = (int)arguments[0];
string f = (string)arguments[1];
string g = (string)arguments[2];
Console.WriteLine("e={0}, f={1}, g={2}", e,f,g);
}
}
void Main()
{
var foo = new Foo();
foo.DoWork("a",1, "c",2L);
var foo1 = new AnotherFoo();
foo1.DoWork(1,"f", "g");
}
具有不同参数的方法不能同时实现相同的接口方法声明。如果您的方法签名与接口的签名不匹配,则您没有实现该接口。
你可以做到这一点,但这不是一个好的设计,因为界面没有告诉你任何关于方法的信息:
interface parentInterface
{
string methodA(params object[] asd);
}
public class childA : parentInterface
{
public string methodA(params object[] p)
{
string a = p[0] as string;
int b = (int)p[1];
string c = p[2] as string;
long d = (long)p[3];
return string.Empty;
}
}
public class childB : parentInterface
{
public string methodA(params object[] p)
{
int e = (int)p[0];
string f = p[1] as string;
string g = p[2] as string;
return string.Empty;
}
}