2010-11-03 62 views
1

出於某種原因,我遇到了接口問題。我知道一個100個例子已經發布,但顯然我不是足夠聰明,看着辦吧......C#接口問題

我有以下接口:

namespace DocStore.Interfaces 
{ 
    public interface IResetCategoryControl 
    { 
    string CategoryToAdd { set; } 
    } 
} 

我想CategoryToAdd設置一個值。

這裏是我的課,我想將它設置在與我到目前爲止什麼:

public partial class AddDocumentsDialog : IResetCategoryControl 

    public string CategoryToAdd 
    { 
     set 
     { 
     IResetCategoryControl() ireset = new IResetCategoryControl(); 
     ireset.CategoryToAdd = value;  
     } 
    } 
    } 

什麼我在AddDocumentDialog類做錯了什麼?我無法讓這部分工作。

謝謝!

Eroc

+1

你有什麼問題?什麼是錯誤信息? – 2010-11-03 14:21:10

+0

這不工作?如果AddDocumentsDialog類不在同一個命名空間中,那麼你需要在接口名稱中使用它,例如。 'DocStore.Interfaces.IResetCategoryControl' – 2010-11-03 14:22:48

+0

你到底在做什麼?這個二傳手並沒有太多的意義,因爲它現在是... – Doggett 2010-11-03 14:24:03

回答

6

行之後是有問題之一:

IResetCategoryControl() ireset = new IResetCategoryControl(); 

首先,你需要擺脫第一個括號中:

IResetCategoryControl ireset = new IResetCategoryControl(); 

接下來,你不能實例化一個接口。接口只是一個必須由具體類實現的簽名。

如果您正在查看其他人的代碼,請右鍵單擊IResetCategoryControl並選擇「查找所有引用」以搜索此接口是否已在某個類中實現。

例如,您可能會發現:

class SomeResetCatControl : IResetCategoryControl 
{ 

} 

在另一方面,它看起來像你只需要設置你的setter方法內部私有領域。你應該做這樣在這種情況下:

public partial class AddDocumentsDialog : IResetCategoryControl 
{ 
    private string _categoryToAdd = ""; 
    public string CategoryToAdd 
    { 
    set 
    { 
     _categoryToAdd = value; 
    } 
    } 
} 

但正如其他人已經指出的那樣,使用只寫屬性是非常不尋常的,並指示錯誤的設計。

+0

這就是我一直在尋找的東西,但正如你所說,這是錯誤的。每個人的帖子都讓我重新思考我是如何做到這一點的,而且我重新設計了它,現在它運行得更順暢。 – ErocM 2010-11-03 14:47:18

1

這不是有效的C# - 刪除了第一雙()

IResetCategoryControl() ireset = new IResetCategoryControl(); 

編輯:它仍然不是有效的C#。你不能實例化一個接口,只有類。

+1

第二部分,他試圖創建一個界面也是無效的... – Doggett 2010-11-03 14:23:12

0

從它的外觀來看,只要你設置了它的一個屬性,ireset就會超出範圍。我猜這應該可能是一個成員變量...我做了'IResetCategoryControl()'類型聲明是一個錯誤的假設,但如果不是,這也是一個問題。

+0

不知道爲什麼這是downvoted,因爲它是正確的。我錯過了實例化一個界面,但是那裏有太多錯誤,很難知道去哪裏尋找...... – Kendrick 2010-11-04 21:36:21

10

你不能實例化一個接口;它僅僅是一個合同而不是一個對象本身。你需要弄清楚契約是什麼意思,並且讓AddDocumentsDialog實現該契約,做任何當CategoryToAdd被設置時應該做的事情。

在旁註中,不鼓勵設置屬性。最好使用一種方法。

+0

發行編號爲3的+1 ... – Kendrick 2010-11-03 14:24:53

+0

+1的設置專用註釋。這是使用屬性的一種相當不尋常的方式。 – Groo 2010-11-03 14:28:44

1

ireset僅在本地定義,在集合內。您將無法訪問任何其他地方

11

我不知道你想在你的二傳手做什麼...但下面的行導致您的問題:

IResetCategoryControl() ireset = new IResetCategoryControl(); 

第一在聲明變量類型時,不要使用括號。其次,你不能直接實例化一個接口的實例。爲了進行有效的發言,將不得不沿着線的東西:

IResetCategoryControl iReset = new SomeConcreteResetCategoryControl(); 

有一個更大的問題,但:

從理論上講,你的類實現接口和接口指定您需要一個名爲CategoryToAdd的房產和一個公共籌款人。該屬性應該設置你的類的值...而不是另一個類的新實例。

我希望的代碼看起來是這樣的:

public partial class AddDocumentsDialog : IResetCategoryControl 
{ 
    private string categoryToAdd; 

    public string CategoryToAdd 
    { 
     set 
     { 
      // do some logic to validate the value 
      categoryToAdd = value; 
     } 
    } 
} 

你也可能要重新考慮你的界面設計只設置屬性通常不鼓勵(贊成使用的方法,因爲一組只有屬性表示一定數量的邏輯被執行,並且該值僅由該類內部使用而不是由消費者再次訪問)。

2

無法實例接口:

IResetCategoryControl() ireset = new IResetCategoryControl(); 

new關鍵字後,您必須使用實現該接口的對象。

1

你不能實例化一個接口。新的IResetCategoryControl永遠不會工作。 AddDocumentsCatalog使用字符串屬性CategoryToAdd實現IResetCAtegoryControl。無論您做什麼計算返回CategoryToAdd由您決定。