Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
418 views
in Technique[技术] by (71.8m points)

c# - What is it called when you edit an interface?

I am going through a LitJSON library. In the code there are lots of segments like

 public class JsonData : IJsonWrapper, IEquatable<JsonData>

 #region ICollection Properties
            int ICollection.Count {
                get {
                    return Count;
                }
            }
    #end region

For a method I know how overriding/overloading works but in the example above the code reads: int ICollection.Count

I'm not familiar with that format for a method signature. Is the coder trying to explicitly state its the ICollection.Count interface?

Could you explain what this is "called" (is it overriding still?).

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

It is called explicit interface implementation. Mainly used to disambiguate members with same name present in different interfaces which also needs different implementation.

Consider you have

interface ISomething1
{
    void DoSomething();
}

interface ISomething2
{
    void DoSomething();
}

class MyClass : ISomething1, ISomething2
{
    void ISomething1.DoSomething()
    {
        //Do something
    }

    void ISomething2.DoSomething()
    {
        //Do something else
    }
}

Without Explicit interface implementation you will not be able to provide different implementation of DoSomething for both the interfaces we implement.

If you want to implement some interface and you want to hide it from the client(upto some extent) you can use explicit implementation. Array class implements IList interface explicitly and that's how it hides IList.Add, IList.Remove etc. Nevertheless you can call it if you cast it to IList type. But you'll end up getting an Exception in this case.

Members implemented via explicit implementations are not visible via class instance(Even inside the class). You need to access it via interface instance.

MyClass c = new MyClass();
c.DoSomething();//This won't compile

ISomething1 s1 = c;
s1.DoSomething();//Calls ISomething1's version of DoSomething
ISomething2 s2 = c;
s2.DoSomething();//Calls ISomething2's version of DoSomething

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...