看下面的類關系圖:
兩個interface,它們之間唯一的關系是:擁有同一個子類。
再看下面的代碼:
class Test
{
public static void Main()
{
Test t = new Test ();
t.testfun(new AB()); //傳入的對象(運行時類型)為AB,是IA的子類沒有問題;
}
public void testfun(IA a) //編譯時類型為IA;
{
IB b = a as IB; //令人費解之處
if(b!=null)
{
b.fun ();
}
Console.Read();
}
}
interface IA
{
}
interface IB
{
void fun();
}
class AB : IA, IB
{
public void fun()
{
Console.WriteLine("AB.fun() called.");
otherOperation();
}
public void otherOperation()
{
Console.WriteLine("Commercial Operation.");
}
}
令我感到費解的是 那行強制轉換代碼:IB b = a as IB;
而對象a: 聲明類型為 IA, 實際傳入類型為 AB, 在實際使用時通過強制轉,轉換為IB接口類型。也就 是IA, IB 兩個接口透過共有的子類實現。我想問:這樣的設計合理嗎?這樣使用會有什麼問題或注意點 ?還是我應該就將其看作一種技巧?
問題來源於看了這兩篇文章:
1. 關於雙重分派:http://perhaps.cnblogs.com/archive/2005/08/20/219048.html
2. 如何讓Visitor變得可愛2:http://www.cnblogs.com/idior/articles/94368.html
文中的設計使用的就是我上面說的這種方式:GraphVisitornv=vasGraphVisitor; 其中對象v就是 ElementVisitor接口類型, 而ElementVisitor, GraphVisitor 兩個接口之間的唯一關系就是擁有共同的 子類XMLVisitor.