2017-07-18 36 views
0

我正在用C#編寫一個工廠模式的dll。工廠收到一個枚舉並返回一個接口。根據接收到的枚舉,它會創建不同的對象並將其返回封裝在接口中。工廠內的任何類都實現了接口,其訪問修飾符是內部的,除了自己的接口是公共的。通過接口訪問不同的對象屬性? C#

問題是當我從主項目調用dll時。在工廠內部創建的每個對象都有不同的屬性,並不是爲什麼我無法從主中訪問或修改這些屬性。一些幫助?

這是來自主工廠的調用。

IConfigurator config = ConfigFactory.Instance.CreateConfigurator(Model.First);

這是怎樣的一家工廠裏打工(在DLL中):

public IConfigurator CreateConfigurator(Model model) 
    { 
     switch (model) 
     { 
      case Model.First: 
       return (First)new First(model); 

      case Model.Second: 
       return (Second)new Second(model); 

      case Model.Third: 
       return (Third)new Third(model); 

     } 

    } 

第一,第二和第三個具有不同的屬性,我不能夠從接口對象修改它收到

謝謝。

+0

您通過您的意思不能修改的屬性?您需要分享您的代碼,以便我們能夠提供適當的解決方案。 –

+2

使用接口的關鍵在於你有符合接口和代碼的對象,它們能夠平等對待它們。這聽起來不像你這樣的情況。 – Luaan

+0

不好意思,我已經用代碼示例編輯了這個問題。 – user462916

回答

1

簡短的回答是,你回來的接口,因此僅是接口的一部分都可以,直到你把對象到它的具體類型的屬性。

例如:

public class A : INameable 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

public class B : INameable 
{ 
    public string Name { get; set; } 
    public string Description { get; set; } 
} 

public Interface INameable 
{ 
    string Name { get; set; } 
} 

public Enum Selector 
{ 
    A, 
    B 
} 

所以,如果我用的方法如下

public INameable GetINameable(Selector selector) 
{ 
    if (selector.Equals(Selctor.A)) 
     return new A { Name = "Name A", Age = 10 }; 
    if (selector.Equals(Selector.B)) 
     return new B { Name = "Name B", Description = "New Instance of B"}; 
} 

我會得到的返回INameable一個實例,將只能訪問Name財產的定義界面。

但是如果我需要訪問其他屬性,然後我需要返回的對象轉換爲它的具體型號如下:

// This will be an instance of INameable 
var obj = GetINameable(Selector.A); 

// Now cast as an instance of A 
var castObj = obj as A; 

// We can now access the Age property 
var age = castObj.Age; 
+0

好的,謝謝。我已經嘗試過了,但現在的問題是不同的類沒有相同的屬性,所以如果我在接口中實現屬性,每個類必須獨立實現屬性,如果它的類具有此屬性或不具有此屬性。 – user462916

+0

只將屬性放入需要的接口中。當您從方法調用中取回接口的實例時,如果需要訪問具體類型的其他屬性,則將其作爲具體類型進行轉換。 –

+0

好的,但我能從主考慮到要投的類是內部的嗎?或者我應該修改它爲公衆? – user462916

0

該方法只能有一個返回類型。 而不是通過枚舉的結果,爲每個項目創建不同的工廠方法/工廠類。

樣品:

// instead of this 
public enum FactoryEnum { 
    VariantA, 
    VariantB, 
    VariantC 
} 
object Create(FactoryEnum item); 

// do this 
IMyInterfaceA CreateA(); 
IMyInterfaceB CreateB(); 
IMyInterfaceC CreateC();