6

What I have learned so far is that we can not create an instance of an interface.

    interface IFood
    {
        string Color { get; set; }
    }
    class Apple : IFood
    {
        public string Color { get ; set; }
    }

IFood food = new IFood(); //this gives compile error

IFood food = new Apple(); //this will work

Upto here everything were okay. But when I work with Microsoft.Office.Interop.Excel I have seen something like below

Application excel = new Application();// Application is an interface

What am I missing here?

Meta data of Application interface

1
  • 1
    COM uses a hyper-pure interface-based programming style. You only ever use an interface, the implementation is completely hidden. Basic reason why it is usable in practically any language. The only place where the notion of a "class" ever comes up is when you need to create an object that implements the interface you want to use. Done hyper-pure style with a factory method. That function only needs a {guid} that identifies the class, the C# compiler can dig it out of the declaration. Commented Dec 31, 2019 at 11:56

4 Answers 4

10

It was an interop ability of COM

Microsoft.Office.Excel API including the Application class, are written in C++

Due to architectural in C++ are more freedom, initialize an interface is needed in some case

.

.NET uses CoClass attribute on a COM object to workaround with initiate an interface

C# wont allow to initiate an interface, but with a CoClass attribute, the interface initialization can be routed to the class CoClass

(example code worth thousand words) So lets reproduce this workaround:

[CoClass(typeof(SugarGlider))] 
[ComImport] // pretend as a COM class
[Guid("000208D5-0000-0000-C000-000000000046")] // put it randomly just to fool the ComImport
public interface ISquirrel
{
     string Foo();
}

[ClassInterface(ClassInterfaceType.None)]
public class SugarGlider : ISquirrel
{
    public string Foo(){ return "Bar"; }
}

You can now initiate the interface by new ISquirrel()

Full example and runs online: https://rextester.com/ORAZQ51751

Sign up to request clarification or add additional context in comments.

1 Comment

Nice explanation
2

It uses CoClass attribute, which is a COM concept. That attribute allows you tell the compiler that your interface will be implemented by Application class, thus allows you to instantiate the interface like that.

Comments

2

The magic is happening because of the CoClass attribute. It declares that the interface Application is to be implemented by ApplicationClass

That’s why the compiler allows Application excel = new Application(); since it can infer what class to instantiate (i.e. ApplicationClass)

What does the C# CoClass attribute do?

How does the C# compiler detect COM types?

Comments

-3

An interface can't be instantiated directly.

"Interfaces Summary" section for more details - https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/interfaces/

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.