我目前正在阅读Effective C#,发现以下行非常混乱:
最后,但同样重要的是,你可以 使用接口来创建const和 非接口版本的接口:
界面有哪些和非对象版本?我们在哪里使用它?
支持代码:
public interface IConstNameValuePair
{
object Name
{
get;
}
object Value
{
get;
}
}
public interface INameValuePair
{
object Value
{
get;
set;
}
}
// Usage:
public class Stuff : IConstNameValuePair, INameValuePair
{
private string _name;
private object _value;
#region IConstNameValuePair Members
public object Name
{
get
{
return _name;
}
}
object IConstNameValuePair.Value
{
get
{
return _value;
}
}
#endregion
#region INameValuePair Members
public object Value
{
get
{
return _value;
}
set
{
_value = value;
}
}
#endregion
}
答案 0 :(得分:3)
它表明,通过其中一个接口,您无法实际修改该值(未定义'set'属性)。将这个'const'称为'const'有点可疑,因为它实际上是一个具有特殊含义的关键字。但这就是作者的意思。
答案 1 :(得分:1)
界面有哪些和非对象版本?
我认为他的意思是'const'和'non-const',就像C ++程序员理解它们一样,即如下所示。
'const'接口是一个无法改变其属性的接口。例如,在下面的代码中,test1方法可以获取但不能设置stuff实例的属性。
'非const'接口是一个可以改变其属性的接口,例如test2方法可以设置以及获取stuff实例的属性。
void test()
{
Stuff stuff = new Stuff();
test1(stuff);
test2(stuff);
}
void test1(IConstNameValuePair stuff)
{
}
void test2(INameValuePair stuff)
{
}
答案 2 :(得分:0)
首先,您需要明确所使用的名称(const和nonconst)的选择非常差。 Const通常指的是值为 const ant的想法,这意味着它无法更改。
查看这两个接口,IConstNameValuePair
仅定义了一个get属性访问器。当你有Stuff
的实例被转换为IConstNameValuePair
时,你实际上有一个不可更改的实例,因为通过该接口无法更改值。
INameValuePair
接口定义了get和set属性访问器。如果您有Stuff
的实例已转换为INameValuePair
,那么您实际上有一个可更改的实例,因为通过该界面您可以更改值。
话虽这么说,解决这个问题肯定比使用两个不同的接口更好。