IMytask是interface哪個有一些方法,Mytask繼承IMytask
為什么總是推薦使用以下一種方式來宣告變數?
IMytask xyz = new Mytask();
你能幫我理解一下,這樣做有什么用和重要性?
uj5u.com熱心網友回復:
它不一定是“重要的”——介面完全有可能是不必要和多余的——它們可能是必不可少的。那是背景關系的。我當然不會說這是默認/自動推薦的方法;我會使用:
var xyz = new Mytask();
或者
Mytask xyz = new();
其中任何一個都會將xyz型別保留為Mytask,而不是IMytask。
介面將API與實作分開。這允許型別實作特定的 API 而不必共享任何型別的型別模型,或者允許使用者在不知道將使用哪些實際具體型別的情況下使用 API - 只是:它們提供什么 API。
例如,.NET 框架代碼(List<T>等)中的“排序”函式可能使用IComparable<T>或IComparer<T>API,但提供比較功能的型別通常在您的代碼中。框架不知道你的代碼,只知道介面。
同樣,介面可能更容易注入、模擬或測驗代碼。
或者:它可能不會增加任何有用的東西!如果只有一種型別實作了介面,而消費代碼很容易直接使用該型別:介面可能是多余的。
在“顯式介面實作”方面也有一些方面(它允許型別實作 API 的方法,而無需將它們放在該型別的公共/默認 API 上)。同樣,這是否重要:背景關系。
uj5u.com熱心網友回復:
我不會說這始終是宣告涉及實作介面的型別的變數的推薦方法,但這樣做通常是有意義的。一個介面代表一個合約,通過宣告該合約的一個變數,您可以解耦實作變數的值。
考慮這個介面:
interface IHelloWorld
{
void Hello();
}
// You could have two implementations of the interface
class Foo : IHelloWorld
{
public void Hello()
{
Console.WriteLine("Hello Earth!");
}
}
class Bar : IHelloWorld
{
public void Hello()
{
Console.WriteLine("Hello Mars!");
}
}
IHelloWorld 型別的變數現在可以表示 Foo 型別或 Bar 型別的實作。
IHelloWorld impl = new Foo();
impl = new Bar();
impl.Hello();
uj5u.com熱心網友回復:
一般來說,您不會將區域變數宣告為介面;相反,您只需將其宣告為具體型別或使用var(在這種情況下與指定具體介面具有相同的效果)。如其他答案中所述,這可以避免某些性能損失。
但是,重要的是要知道,在某些情況下,您會看到使用介面宣告變數和使用具體型別之間的功能差異。var如果具體型別用于explicit interface implementation實作介面,則可能會發生這種情況。
將舉例說明。考慮以下簡單介面:
public interface IDemo
{
void SayHello();
}
現在考慮這個實作:
public sealed class Demo: IDemo
{
public void SayHello()
{
Console.WriteLine("Wave Goodbye");
}
void IDemo.SayHello() // Explicit implementation of "SayHello()".
{
Console.WriteLine("Hello!");
}
}
有了這個,看看下面的用法:
Demo demo = new Demo();
demo.SayHello(); // Outputs "Wave Goodbye"
IDemo idemo = demo;
idemo.SayHello(); // Outputs "Hello!"
因此,如果您SayHello()通過具體類呼叫,您會得到與SayHello()通過介面呼叫不同的結果。
在這種情況下,是否需要使用具體類或介面取決于背景關系(我會說最終陷入這種困境是糟糕設計的結果)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/513885.html
標籤:C#网。网视觉工作室界面
