Reputation: 2422
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?
Upvotes: 6
Views: 4278
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
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
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
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