2016-05-16 80 views
0

我有以下問題。看看我的代碼結構。 如果我的所有派生類在過程(動物a)中具有相同的方法序列,這將是確定的。但想象一下,我有Turtle類,它擴展了Animal,當Process(Animal a)被調用時,裏面的方法必須以不同的順序,並且類Turtle有一些額外的方法,例如Sleep。 在這種情況下我該怎麼辦? 感謝在C中使用虛擬方法#

public class Animal 
{ 
    public virtual string Eat(){ return "I'm eating"; } 
    public virtual string MakeNoise() { return "I'm ";} 
    public virtual string Go() { return "I'm walking"; } 
} 

public class Dog : Animal 
{ 
    public override string Eat() 
    { 
     return string.Format("{0} {1}",base.Eat(),"a pie"); 
    } 

    public override string MakeNoise() 
    { 
     return string.Format("{0} {1}",base.MakeNoise(),"barking"); 
    } 
} 

public class Controller 
{ 
    public void Process(Animal a) 
    { 
     a.Eat(); 
     a.MakeNoise(); 
     a.Go; 
    } 
} 

public class Client 
{ 
    IList<Animal> animals= new List<Animal>(){Dog,Cat,Turtle,Mouse}; //all animals have base class Animal 
    Controller = new Controller(); 
    foreach(Animal a in animals) 
    { 
     p.Process(a); 
    } 
} 
+4

這改變了'Controler',而不是'Animal'的行爲,因此您需要創建重寫類型,例如, 'TurtleController' – Rhumborl

回答

2

您可以添加一個重載的方法

public void Process(Turtle t) 
    { 
     //Do what you want here 
    } 
0

你可以寫自己一個控制器工廠,將返回一個適當的控制器對於一個給定的動物。爲Turtle等創建控制器的子類。在這裏我假設我們可以提取接口IControler和IAnimal,但是可以使用抽象基類型。

public class ControllerFactory 
{ 
    public static IController GetController (IAnimal animalToControl) 
    { 
    if (animalToControl is Turtle) { return new TurtleController(); } 
    if (animalToControl is Sheep) { return new SheepController(); } 

    // default 
    return new Controller(); 
    } 
} 

,並呼籲有:

foreach(Animal a in animals) 
{ 
    var p = ControllerFactory.GetController(a); 
    p.Process(a); 
} 

的工廠實現這裏是粗糙的,但說明了這一點。

0

每隻動物都有Eat,MakeNoiseGo,但是序列因動物而異(加上一些動物的一些額外行爲)。對於給定的動物,序列是否總是相同?是他們繼承Animal的唯一原因,以便他們可以共享相同的基本行爲,並只在需要時才覆蓋它們?

如果是這樣,那麼也許在控制器中而不是Process方法,Animal應該有一個ExecuteBehaviors方法,可以由個別動物覆蓋。

public virtual void ExecuteBehaviors() 
{ 
    Eat(); 
    MakeNoise(); 
    Go(); 
} 

然後,如果動物需要不同的順序,它可以覆蓋該方法。 這似乎符合你的問題的描述,讓每個動物繼承行爲,但控制他們的序列,並添加新的行爲。

然後在您的控制器中,您可以爲每隻動物調用ExecuteBehavior。這是工作中真正的多態性。您可以將Animal的任何實例視爲相同,並調用相同的方法,無論它是Dog還是Turtle,即使它們的行爲會有所不同。

0

您有兩種選擇,第一種是擴展Process方法。您可以在裏面進行切換,並在a.GetType()== typeof(Turtle)時定義順序。

public class Controller 
{ 
    public void Process(Animal a) 
    { 
     if(a.GetType() == typeof(Turtle) 
     { 
     ((Turtle)a).YourMethod(); 
     } 
     else 
     { 
     a.Eat(); 
     a.MakeNoise(); 
     a.Go; 
     } 
    } 
} 

也可以使動物類,負責過程的方法。 這裏的想法我認爲不是讓動物類負責處理方法。這是控制器開始行動的地方。嘗試使用裝飾者模式或工廠爲每個動物,因爲@Brett說