如何通过保留方法名称来扩展接口
本文关键字:扩展 接口 何通过 保留 方法 | 更新日期: 2023-09-27 18:21:16
给定两个接口:
interface I1 {
int Foo();
}
interface I2 {
void Foo();
}
还有一类:
class Test : I1, I2 {
int I1.Foo() {
Console.WriteLine("I1.Foo");
return default(int);
}
public void Foo() {
Console.WriteLine("I2.Foo");
}
}
如何通过保留名为Foo
的方法来用I1
扩展接口I2
?
我尝试了以下代码,但没有编译:
interface I1 {
int Foo();
}
interface I2 : I1 {
void I2.Foo();
}
class Test : I2 { /* same code */ }
示例中不清楚如果允许,在接口中显式声明I2.Foo()
将实现什么。规范(第13.4.1节)允许实现接口的结构或类声明显式成员实现。(接口不能声明任何实现,无论是显式的还是其他的)。
因此,假设我们定义了:
interface IFoo
{
void Bar();
}
interface IBaz : IFoo
{
new void Bar();
}
interface IQux : IBaz { }
class A : IQux // equivalent to class A : IQux, IBaz, IFoo (spec sec. 13.4.6)
{
void IFoo.Bar()
{
Console.WriteLine("IFoo.Bar");
}
void IBaz.Bar()
{
Console.WriteLine("IBaz.Bar");
}
public void Bar()
{
Console.WriteLine("A.Bar");
}
// Not allowed: void IQux.Bar() {...}
// Since "The fully-qualified name of the interface member
// must reference the interface in which the member
// was declared" (s. 13.4.1)
}
然后下面的驱动程序显示了显式接口方法实现的效果。
public static void Main()
{
A a = new A();
a.Bar(); // prints A.Bar
(a as IFoo).Bar(); // prints IFoo.Bar
(a as IBaz).Bar(); // prints IBaz.Bar
(a as IQux).Bar(); // prints IBaz.Bar
}
不太确定你想让它做什么,但你可以做:-
public interface I1
{
int Foo();
}
public interface I2:I1
{
new void Foo();
}
只有当两个方法具有不同的签名时,它才有效,这意味着它们必须具有不同数量的参数或不同类型的参数,或者两者兼而有之。
为什么不将您的两个方法命名为GetFoo
和DoFoo
呢?
这将工作
public interface I1
{
int Foo();
}
public interface I2 : I1
{
void Foo(int i);
}
这也适用于
public interface I1
{
int GetFoo();
}
public interface I2 : I1
{
void DoFoo();
}
你也可以申报财产。属性由两个方法组成:getter和setter。
public interface I
{
int Foo { get; set; }
}
public class C : I
{
private int _foo;
public int Foo
{
get {
// getter
return _foo;
}
set {
// setter
_foo = value;
}
}
}