问题:典型的,List<T>实现了IList<T>,ICollection<T>等接口,并且没有抽象父类,但是它却不能调用IsReadOnly属性,只能向上类型转换后调用,为什么?这个属性是在什么地方实现的?同样问题还有DataTable继承了IListSource接口,却不能直接调用GetList()方法,在反编译的类方法也找不到该方法。
MSDN描述:此成员是显式接口成员的实现。它只能在 DataTable 实例被强制转换为 IListSource接口时使用。
解惑者 100分全送
MSDN描述:此成员是显式接口成员的实现。它只能在 DataTable 实例被强制转换为 IListSource接口时使用。
解惑者 100分全送
{
int ITest.IsReadOnly
{
get { return -1; }
}
} public interface ITest
{
int IsReadOnly
{
get;
}
}这样应该明白了把.
[ComVisible(true)]
public interface IList : ICollection, IEnumerable
{
// Methods
int Add(object value);
void Clear();
bool Contains(object value);
int IndexOf(object value);
void Insert(int index, object value);
void Remove(object value);
void RemoveAt(int index); // Properties
bool IsFixedSize { get; }
bool IsReadOnly { get; }
object this[int index] { get; set; }
}//List<T>的IList.IsReadOnly
bool IList.IsReadOnly
{
get
{
return false;
}
}
//DataTable的GetList
IList IListSource.GetList()
{
return this.DefaultView;
}刚才没有回复,因为没搞明白这种 显示的接口实现, 刚看到上面的回复才有了关键词。 呵呵 学习了引用:
看了回复后知道这种情况就是显示实现接口(Explicit interface member implementations)。
显示实现接口说明:
1、不能在方法调用、属性访问以及索引指示器访问中通过全权名访问显式接口成员执行体。事实上,显式接口成员执行体只能通过接口的实例,仅仅引用接口的成员名称来访问。
2、显式接口成员执行体不能使用任何访问限制符,也不能加上abstract, virtual, override或static 修饰符。
3、显式接口成员执行体和其他成员有着不同的访问方式。因为不能在方法调用、属性访问以及索引指示器访问中通过全权名访问,显式接口成员执行体在某种意义上是私有的。但它们又可以通过接口的实例访问,也具有一定的公有性质。
4、只有类在定义时,把接口名写在了基类列表中,而且类中定义的全权名、类型和返回类型都与显式接口成员执行体完全一致时,显式接口成员执行体才是有效的
5、如果一个类中既显示又隐式的实现了接口,这是显示元素只能通过接口的引用来直接访问,隐式元素只可以通过类来直接访问。
为什么要显示实现接口呢,目的:
1、因为显式接口成员执行体不能通过类的实例进行访问,这就可以从公有接口中把接口的实现部分单独分离开。如果一个类只在内部使用该接口,而类的使用者不会直接使用到该接口,这种显式接口成员执行体就可以起到作用。
2、显式接口成员执行体避免了接口成员之间因为同名而发生混淆。如果一个类希望对名称和返回类型相同的接口成员采用不同的实现方式,这就必须要使用到显式接口成员执行体。如果没有显式接口成员执行体,那么对于名称和返回类型不同的接口成员,类也无法进行实现。