2008-11-13 66 views
2

我需要我的類的一個成員是一個控制,併爲它實現我們定義的接口。我可以在聲明成員時指定接口嗎?

我若像這樣...

public class MyClass 
{ 
    public Control MyMember; 
} 

...然後我不明白的接口方法,但如果我宣佈它像這樣...

public class MyClass 
{ 
    public IMyInterface MyMember; 
} 

...然後我沒有得到控制方法。有沒有一種方法來指定MyMember必須被初始化爲從兩者繼承的類型?我在MSDN上找不到一個。喜歡的東西...

public class MyClass 
{ 
    public Control : IMyInterface MyMember; 
} 

......或者......

public class MyClass 
{ 
    public Control MyMember : IMyInterface; 
} 

...只是既不這些工作。我可以在聲明一個成員時指定接口嗎?如果是這樣,怎麼辦?

回答

-1

使用繼承的電源接口

public interface IMyInterface : Control 
{ 
    .. 
} 

上現在你說你想用一些特殊的方法控制。


編輯:第三文化孩子當然是正確的..你不能繼承一個具體類的接口。

解決此問題的一種方法可能是使用返回控件的屬性或方法來擴展接口。

樣品:

public interface IMyInterface 
{ 
    Control Control { get; } 

    [..rest of the definition..] 
} 

,並實現它這樣的:

class MyControl : Control, IMyInterface 
{ 
    public Control Control { get { return this; } } 

    [..rest of the implementation..] 
} 
+0

接口不能從類繼承。 – TcKs 2008-11-13 09:12:15

+0

當然你是對的..我在想什麼。 – VVS 2008-11-13 09:18:52

+0

編輯之後,我還沒有其他的評論:)。 – TcKs 2008-11-13 10:40:53

2

您可以使用泛型與約束:

public interface MyClass { 
    public T GetMyControl() where T : Control, IMyInterface { /* ........ */ } 
} 
0

你可以有你自己的類從控制派生用界面如下定義:

class MyControl : Control, IMyInterface 
{ 
} 

,然後使用這個類的成員:

public class MyClass 
{ 
    public MyControl MyMember; 
} 
1

因爲它是非常麻煩寫圍繞控制和簡單的泛型類的包裝類:

public class MyGenericClass<T> where T : Control, IMyInterface 
{ 
    public T t; 
} 

可能不適合你的需求。 你可以簡單地使用不同的屬性來訪問不同的領域:

public class MyClass 
{ 
    private IMyInterface m_field; 
    public Control FieldAsControl 
    { 
     get { return m_field as Control; } 
    } 
    public IMyInterface Field 
    { 
     get { return m_field; } 
     set 
     { 
      if (m_field is Control) 
      { 
       m_field = value; 
      } 
      else 
      { 
       throw new ArgumentException(); 
      } 
     } 
    } 
} 
-1

這聽起來根本錯誤的。

IMyInterface是否僅聲明與Control類中找到的相同的方法/屬性? 如果不是,你希望完成什麼?你不能實現一個接口並忽略其中聲明的方法 - 你必須明確寫出實現。

如果IMyInterface確實只聲明Control類中找到的相同方法/屬性,則必須創建自己的MyControl類,該類繼承自Control並實現IMyInterface。這不是語言的一些愚蠢的怪癖。 Control類不定義爲一個IMyInterface的和C#是一種靜態類型 - 不是「鴨子類型」 - 語言,所以它不能自動給控制你想用的任何接口。

0

聲明接口ISelf(出的T)[*]其中包括一個功能「自我」,返回T.有您的接口支持非通用和通用版本,其中通用版本繼承了非通用版本和ISelf(本身)。然後,您可以從兩個ISelf(管制)和ISelf(的IMyInterface的)一個類繼承並宣佈你的領域MyMember爲類型ISelf(IMyInterface的的(控制))。 MyMember可以作爲iMyInterface使用,MyMember.Self作爲控件使用。任何數量的接口都可以用這種方式進行組合。

[*]用於避免將尖括號作爲HTML標記進行處理的泛型的VB語法。

相關問題