2012-08-07 55 views
1

我的第一個基於接口的編程時間和一些關於如何設計接口的混淆。關於接口和類設計的建議

我已經創建了關係的接口兩個節點之間,就像這樣:

public interface IOWLRelation 
{ 
    IOWLRelation AddSubClass(IOWLClass parent, IOWLClass child); 
} 

然後,我創建的類實現這個接口,這樣的:

class OWLRelation: IOWLRelation 
{ 
    public OWLClass Parent { get; set; } 
    public OWLClass Child { get; set; } 

    public IOWLRelation AddSubClass(IOWLClass parent, IOWLClass child) 
    { 
     this.Parent = (OWLClass) parent; 
     this.Child = (OWLClass) child; 
     return this; 
    } 

} 

那麼首先:你是否以我聲明這些類和接口的方式看到了一個壞習慣? 現在我的困惑是關於我在課堂上定義的那兩個公共屬性:我是否還需要在接口中定義它們? 另外如果我想添加一個枚舉成員到這個類呢? 無論我添加到我的班級,我還應該將其添加到其界面?

更重要的是在方法實現中,我將Interface傳遞給該方法的參數,它是不好還是不正確?我應該通過界面還是應該通過他們的真實課程?

回答

1

在這種情況下,我會稍微改變你的實現。如果你想通過使用你的界面的人的工作流程,這是有點混淆。你必須先創建一個OWLRelation對象,然後調用AddSubClass方法,它只返回你已經創建的對象。我會用一個工廠方法來代替:

public interface IOwlRelation 
{ 
    OwlClass Parent { get; } 
    OwlClass Child { get; } 
} 

public class OwlRelation : IOwlRelation 
{ 
    public OwlClass Parent { get; private set; } 
    public OwlClass Child { get; private set; } 

    public static IOwlRelation Create(OwlClass parent, OwlClass child) 
    { 
     return new OwlRelation 
     { 
      Parent = parent, 
      Child = child 
     }; 
    } 
} 

公告創建方法是靜態的,所以你不必創建它的一個實例只是爲了得到它的一個實例。另外,Parent和Child類只能通過界面進行讀取,但您可以從課程內部進行設置。這通常是保持屬性不被後面覆蓋的好習慣,但您不一定非得這樣做。我還將這些類重命名爲使用普通駱駝套裝,即使是首字母縮寫詞,因爲這是C#命名標準的一部分。

+0

感謝蒂姆,看起來像我們都住在同一個城市:) - – Bohn 2012-08-07 16:38:27

+0

我需要更多的工作在這方面。爲什麼在工廠方法中返回'IOwlRelation'而不是簡單的'OwlRelation'?我並不是說這是錯誤的,只是我從來不會想到這一點。 – jp2code 2012-08-07 16:42:45

+1

主要好處是你的OwlRelation類可能有其他的實現細節不適用於這個接口。接口的存在是爲了準確定義對於特定類而言重要和相關的內容。消費者不需要知道我們班上發生了什麼,甚至是什麼。他們需要知道的是,我們有屬性可以獲得父母和孩子。 – 2012-08-07 16:50:46

1

如果從IOWLRelation繼承的其他類也需要父/子,那麼還要在接口中定義這些屬性(也許在此情況下將接口重命名爲更通用的名稱)。

在接口中,您應該定義您希望繼承的類具有的所有屬性/方法(至少)。

傳遞接口完全沒有問題。實際上它可能比實際的類更好,因爲界面更通用。

+1

好的感謝解釋。那我在課堂上的那兩個家長和孩子的屬性怎麼樣?curretny他們是他們的類類型,而不是他們的接口類型,所以你認爲定義他們的類型也是他們的接口類型也更好? – Bohn 2012-08-07 16:28:06

+1

哦,在你的回答中,你的意思是輸入「IOWLRelation」? – Bohn 2012-08-07 16:29:08

+0

您也可以爲這些(IOWLClass)創建一個接口,並將這些屬性放在IOWLRelation的接口中,假設從IOWLRelation繼承的其他類也將這些類型用於父級和子級。 – 2012-08-07 16:30:44

1

想想接口將如何被使用。如果調用者想要了解Parent或Child,那麼你想在界面中公開它。如果它們只是實現細節,那麼不要將它們包含在界面中。

關於這些東西並沒有真正嚴格的規則,因爲這完全取決於如何使用接口。

我會說在AddSubClass,如果您總是將參數投射到OWLClass,您可能想要考慮這是否對調用者有意義。他們會不會試圖通過傳遞兩個不同的實現IOWLClass?如果這樣做,演員陣容會拋出異常。這可以接受嗎?