相信許多人在使用地表最強IDE Visual Studio 來繼承實作介面(Interface)成員的時候,旁邊的
小燈泡在提示實作的同時也會提示明確實作。
小燈泡在提示實作的同時也會提示明確實作。
很多時候我們選擇忽略這個提示繼續實作我們必須實作的成員,但總有一天該逃的總是逃不
過,所以到底什麼是明確實作?
一言以蔽之,明確實作成員會透過該介面個體進行存取呼叫。
public interface IAnimal
{
string Name { get; set; }
void Voice();
}
public class Dog : IAnimal
{
public string Name { get; set; }
public void Voice()
{
Console.WriteLine("有狗發出聲音");
}
void IAnimal.Voice()
{
Console.WriteLine("有動物發出聲音");
}
static void Main(string[] args)
{
var dog = new Dog();
dog.Voice(); // output 有狗發出聲音
((IAnimal)dog).Voice(); // output 有動物發出聲音
Console.ReadKey();
}
}
從上方的程式碼中看到同一個個體實例在不同的形態下做的事情不一樣,Dog沒辦法呼叫
IAnimal.Voice,只有當Dog是IAnimal時才可以呼叫專屬於IAnimal的明確實作Voice。
這樣有什麼好處?
代表著我們能夠依照同一個個體因實際狀況的不同去去做不一樣的事,甚至是不同型態的回傳與參數也都能辦到(如下方)。
public class Dog : IAnimal
{
public string Name { get; set; }
public string Voice()
{
return ($"有{this.Name}發出聲音");
}
void IAnimal.Voice()
{
Console.WriteLine(this.Voice());
}
static void Main(string[] args)
{
var dog = new Dog() { Name = "法國鬥牛犬"};
dog.Voice();
((IAnimal)dog).Voice();
Console.ReadKey();
}
}
當然也能在明確實作與實作並存的情況下我們要讓他做一樣的事,利用明確實作區隔讓物件再強型態時執行效率更好的存取。
除此之外還有什麼樣的用法呢?
當一個物件繼承兩個擁有時相同成員,我們也能用明確實作去區隔他們在不同介面個體的情況下做不一樣的事。
public interface IAnimal
{
string Name { get; set; }
void Voice();
}
public interface IDog
{
string Name { get; set; }
void Voice();
}
public class Dog : IAnimal, IDog
{
public string Name { get; set; }
public void Voice()
{
Console.WriteLine($"{Name}在叫");
}
void IAnimal.Voice()
{
Console.WriteLine("有一個動物在叫");
}
void IDog.Voice()
{
Console.WriteLine("有一隻狗在叫");
}
static void Main(string[] args)
{
var dog = new Dog() { Name = "法國鬥牛犬"};
dog.Voice(); // output 法國鬥牛犬在叫
((IAnimal)dog).Voice(); // output 有一個動物在叫
((IDog)dog).Voice(); // output 有一隻狗在叫
Console.ReadKey();
}
}
有時候在實作成員的時候難免被簽章所束縛感到不便,或是依照實際運作的不同,我們需要
改變方法的行為,明確實作的確大幅提升了介面實作成員使用上的彈性,但要小心的是,當
明確實作的方法與派生類別內的同名成員做的事差異太大時,難免會讓要接你的程式碼的同
事阿明或小王混亂,所以明確實作的規劃還是必須多多考慮!
留言
張貼留言