Beingnin
Beingnin

Reputation: 2422

How is it possible to initialize an interface?

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

Upvotes: 6

Views: 4278

Answers (4)

nyconing
nyconing

Reputation: 1136

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

Upvotes: 10

NGambit
NGambit

Reputation: 1181

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?

Upvotes: 2

JohanP
JohanP

Reputation: 5472

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.

Upvotes: 2

Indar
Indar

Reputation: 305

An interface can't be instantiated directly.

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

Upvotes: -3

Related Questions