2013-09-23 48 views
0

我可以用一個例子來最好地說明這個問題。強制接口/類在派生類中定義字符串變量?

我有一個強制開發人員實現特定功能的界面。我還希望這個接口強制用戶實現一個set或者get屬性,該屬性設置類中存儲的字符串中派生類的名稱。因此,如果開發人員創建,從這個接口派生新類,他們被迫:

  1. 創建的方法的定義。
  2. 存儲在一個字符串的派生類的所謂「derivedType」

我想的名字存儲爲派生類型的字符串,因爲我希望做一些類型在運行時檢查名稱在實現此接口的對象上。

public interface someInterface 
{ 
    int someMethod(int x); 
    string derivedType {get; set;} 
} 

public derivedClass : someInterface 
{ 
    public int someMethod (int x) {...}; 
    public string derivedType 
    { 
     get {return this.derivedType;} 
     set {derivedType = "derivedClass";} 
    } 
} 
+0

爲什麼要用setter創建一個屬性,但忽略它試圖設置的值?爲什麼你將值設置爲'derivedType'而不是'derivedClass'? –

+0

哦,並且注意聲明*屬性*與聲明*變量*不同。 –

+0

@JonSkeet他也從'derivedClass'中省略了'class'關鍵字。 –

回答

4

有兩件事 - 首先,您的示例實現不正確。如果您嘗試獲得derivedType(因爲它自己回來),它將引發StackOverflowException。一般情況下,一個setter就不會在這裏要求:

public interface ISomeInterface 
{ 
    int SomeMethod(int x); 
    string DerivedType {get;} 
} 

public class DerivedClass : ISomeInterface 
{ 
    public int DomeMethod (int x) {...}; 
    public string DerivedType 
    { 
     get {return "derivedType"; } 
    } 
} 

話雖這麼說,沒有辦法實施者正確地做到這一點。如果你想保證名稱是正確的,你可以使用反射,而不是把它放入界面(object.GetType().Name)。

+0

那麼我甚至不需要字符串,如果我在我的類型檢查方法中使用object.GetType()。Name? – user1084113

+0

@ user1084113是的 - 在實例上使用'GetType()。Name'將通過反射返回類型的名稱。 –

+0

非常好,不知道我可以做到這一點。謝謝。 – user1084113

0

試試這個:

public interface someInterface 
{ 
    int someMethod(int x); 
    string derivedType {get;} 
} 

public derivedClass : someInterface 
{ 
    public int someMethod (int x) {...}; 
    public string derivedType 
    { 
     get {return "derivedType";} 
    } 
} 

也就是說,使屬性只讀,並實現它返回的硬編碼字符串。必要時重構。

1

您應該使用GetType()來代替。

ISomeInterface myObject = new DerivedClass(); 
Type myType = myObject.GetType(); 
string typeName = myType.Name; // "DerivedClass"