2017-04-12 140 views
1

我需要在c#中做這樣的事情。但在執行(對象)我有一個編譯錯誤。C#類依賴注入

public class ParentClass { } 
public class class1 : ParentClass 
{ 
} 
public class class2 : ParentClass 
{ 
} 
public class class3 : ParentClass 
{ 
} 

public class MasterClass 
{ 
    public void ExecutionMethod(ParentClass myObject) 
    { 
     //some code 
     Exec(myObject); 
     //some code 
    } 

    public void Exec(class1 obj) 
    { 
     //some code 
    } 
    public void Exec(class2 obj) 
    { 
     //some code 
    } 
    public void Exec(class3 obj) 
    { 
     //some code 
    } 
} 

我解決了使用反射,但我認爲必須有一個更好的方法,有人可以給我一個很好的主意

+0

你收到了什麼編譯錯誤? – EJoshuaS

+0

@EJoshuaS他正在傳遞一個'ParentClass',但他沒有超載,需要一個'ParentClass'。 –

+0

@ScottChamberlain是的,我確實看到這一點,只是認爲值得要求這篇文章包含完整的錯誤文本否則它對未來的讀者來說會少許多) – EJoshuaS

回答

-1

正如@ScottChamberlain在評論中指出的那樣,您沒有任何採用ParentClass類型參數的方法。

看看在Liskov substitution principle - 如果你正確地完成您的實現,可以爲ParentClass實例替代的實例,例如,class1,但反之不真正在所有。

可能性是,您不需要(或不想)重載。只需要ParentClass是一個抽象類,其中包含所有子類必須實現的摘要Execute方法,然後您可以直接在類上調用Execute而不必擔心重載。更好的是,使ParentClass成爲一個界面。 (順便提一句,這有時叫做Strategy Pattern)。

public interface IParent { 
    void Execute(); 
} 

public class class1 : ParentClass { 
    //Execute method implementation 
} 

public class class2 : ParentClass { 
    // ... 
} 

public class class3 : ParentClass { 
    // .... 
} 

public class MasterClass 
{ 
    public void ExecutionMethod(IParent myObject) 
    { 
     //some code 
     myObject.Execute(); 
     //some code 
    } 
} 
+0

謝謝,是exacly我需要:) –

+0

順便說一下,誰downvoted,爲什麼? – EJoshuaS

+0

@LuisRivasNoriega如果它解決了問題,你可以[接受答案](http://stackoverflow.com/help/accepted-answer)? – EJoshuaS

0

您需要使用一個接口這裏

嘗試改變ParentClass這樣的:

public interface IParentClass{} 

然後讓每個類的實現它,像這樣:

public class class1 : IParentClass 
{ 
} 

public class class2 : IParentClass 
{ 
} 

然後在你的大師班,試試這個:

public void ExecutionMethod(IParentClass myObject) 
{ 
    //some code 
    Exec(myObject); 
    //some code 
} 

public void Exec(IParentClass obj) 
{ 
    //some code 
} 

然後你就可以在任何類中實現了IParentClass接口的通過。

現在,作爲增強 - 如果你想的IParentClass每個實現有一定的方法和屬性,你可以在你的exec方法調用,做到像這樣:

public interface IParentClass 
{ 
    void DoTheThing(); 
} 

這將迫使你有這個方法在派生類中,因此,例如,class1的應該是這樣的:

public class class1 : IParentClass 
{ 
    public void DoTheThing() 
    { 
     // things get done... 
    } 
} 
public class class2 : IParentClass 
{ 
    public void DoTheThing() 
    { 
     // things get done a different way... 
    } 
} 

現在在你的exec方法,你可以調用像這樣:

public void Exec(IParentClass obj) 
{ 
    obj.DoTheThing(); 
} 
+0

謝謝,但我需要根據類的具體行爲。例如。如果class1接着是DoMethod1(class1.Name),如果class2接着DoMethod2(class2.PhoneNumber); 這就是爲什麼我需要一個具體的方法foreach類 –

+0

我已經更新了我的答案,以顯示如何爲派生類定義方法。 HTH – geekzster

0

您可以使用命令模式和依賴注入。下面我給你一個想法。具體實施將調用execute接收器上(你的邏輯去那裏

public interface ICommand 
{ 
    void Execute(); 
} 

public class Command1 : ICommand 
{ 
    public void Execute() 
    { 
     throw new NotImplementedException(); 
    } 
} 
public class Command2 : ICommand 
{ 
    public void Execute() 
    { 
     throw new NotImplementedException(); 
    } 
} 
public class Command3 : ICommand 
{ 
    public void Execute() 
    { 
     throw new NotImplementedException(); 
    } 
} 

public class CommandManager 
{ 
    //you should use DI here to inject each concerete implementation of the command 
    private Dictionary<string, ICommand> _commands; 

    public CommandManager() 
    { 
     _commands = new Dictionary<string, ICommand>(); 
    } 

    public void Execute(string key) 
    { 
     _commands[key].Execute(); 

    } 
} 
0

錯誤你看到的是你的class1,2,3對象的結果被投作爲它們的父類,因爲ExecutionMethod的簽名( xxx) 而且沒有一個Exec的重載方法,它將一類'ParentClass'作爲參數。

也許最簡單的方法是創建一個接口:

IDomainObject{}. 
public class ParentClass : IDomainObject { } 
public void ExecutionMethod(IDomainObject myObject) 
    {   
     Exec(myObject);  
    } 

這樣,才能防止方法調用期間喪氣使用的接口。

1

我建議你看看面向對象的設計模式。具體而言,這個問題的策略模式。無論如何,你可以實現你想要的東西是這樣的:

public interface IParent 
{ 
    void Exec(); 
} 
public class Child1 : IParent 
{ 
    void Exec() { /*code*/ } 
} 
public class Child2 : IParent 
{ 
    void Exec() { /*code*/ } 
} 
public class Child3 : IParent 
{ 
    void Exec() { /*code*/ } 
} 

public class MasterClass 
{ 
    public void ExecutionMethod(IParent myObject) 
    { 
     //some code 
     myObject.Exec(); 
     //some code 
    } 
} 

你也可以使用,而不是一個接口一個抽象類,如果你想要的父類有Exec方法的一些功能 - 那麼子類會必須重寫該方法。