程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 實現多個interface與令人費解的強制類型轉換

實現多個interface與令人費解的強制類型轉換

編輯:關於.NET

看下面的類關系圖:

兩個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.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved