C#中异常的成员重写语法
本文关键字:重写 语法 成员 异常 | 更新日期: 2023-09-27 18:00:33
因此,有人告诉我,解决类继承中歧义的一个好方法是使用以下习语:
class INewList<T> : IList, IList<T>
{
new T IList<T>.this[int index] { get; set; }
}
我不太理解List<T>.this
语法。这与简单地做有什么不同:
new T this[int index] { get; set; }
这两个功能不同吗?在前一个例子中,我以后是否需要为索引器提供一个实现,或者这段代码只是告诉编译器"嘿,如果有疑问,请在IList<T>
中使用索引器实现"?
这叫做显式实现。当您显式实现接口成员时,它只能通过该类型的引用(或子类型,请参见下文)调用,因此换句话说,IList
(非泛型)引用将无法调用您的第一个示例。
下面是子类型如何工作的示例:
void Main() {
I2 myC = new C();
myC.Operation();
}
interface I1 {
void Operation();
}
interface I2 : I1 { }
class C : I2 {
void I1.Operation() {
Console.WriteLine ("called operation");
}
}
如果执行此操作,您将看到控制台输出。如果myC
被声明为C
,它将不起作用。
(更新以添加示例)
这是对this
作为IList<T>
实现者的引用
否则,您无法从此属性返回T
,因为"普通"ILIst
的实现可能存在歧义
它显式地实现了接口的索引器
- 显式实现导致
Interface.XYZ
语法 - 索引器的名称为
this
,因此它变为Interface.this
它被称为显式接口实现,用于解决诸如实现两个碰巧共享成员名称的接口之类的问题。基本上,它是一个只有当对象被转换到特定接口中时才能调用的方法。
说:
INewList<int> myList = new NewList<int>();
myList[1] = 2; // Error, this[int index] is not implemented.
IList<int> myList2 = myList; // Cast as IList<int>
myList2[1] = 2; // Succeeds, it'll call IList<T>.this[int index].
IList myList3 = myList; // Cast as IList
myList3[1] = 2; // Error, neither this[int index] nor IList.this[int index] are not implemented.
当然,如果您确实实现了其中一个,它会调用相应的方法,显式实现会覆盖任何隐式实现。
您的代码示例非常混乱,无法编译。然而,要回答您关于List<T>.this
语法的问题:
这被称为显式接口实现。您使用它来实现接口,但对类的公共签名隐藏它。这里有一个小例子:
public class Foo : IDisposable {
public void Dispose() {
}
}
public class Bar : IDisposable {
public void Close() {
}
void IDisposable.Dispose() {
Close();
}
}
这两个类都实现IDisposable
,但要处理Bar
,必须调用Close
。您也可以将其强制转换为IDisposable
,然后调用Dispose
。
var foo = new Foo();
foo.Dispose();
var bar = new Bar();
bar.Close();
((IDisposable) bar).Dispose();
对于类Foo
和Bar
,如果清理方法被称为Dispose
或Close
可能并不重要,但对于File
类,您可能更喜欢Close
而不是Dispose
。其他用途是隐藏必须实现的接口,以参与对象之间的交互,但您不希望对类的使用者可见。或者,您可以使用它来实现具有冲突方法的多个接口。
您可以在MSDN上阅读有关显式接口实现的信息。