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?
You do not 'initialize' an interface. If you create a class that 'implements' an interface, you are creating a class that gives an implementation for every abstract method that is in that interface. No doubt other people will point to abstract classes, but that for some other time.
No you can not declare variable in interface. No, we can't declare variables, constructors, properties, and methods in the interface.
Interface variables are static because java interfaces cannot be instantiated on their own. The value of the variable must be assigned in a static context in which no instance exists. The final modifier ensures the value assigned to the interface variable is a true constant that cannot be re-assigned.
Interfaces can't be instantiated by definition. You always instantiate a concrete class. So in both statements your instance is actually of type UnityContainer .
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
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.
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?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With