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

Beingnin
  • 2,288
  • 1
  • 21
  • 37
  • 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](https://learn.microsoft.com/en-us/windows/win32/api/combaseapi/nf-combaseapi-cocreateinstance). That function only needs a {guid} that identifies the class, the C# compiler can dig it out of the declaration. – Hans Passant Dec 31 '19 at 11:56

4 Answers4

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

nyconing
  • 1,092
  • 1
  • 10
  • 33
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?

NGambit
  • 1,141
  • 13
  • 27
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.

JohanP
  • 5,252
  • 2
  • 24
  • 34
-2

An interface can't be instantiated directly.

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

Indar
  • 267
  • 2
  • 11