C# 在C语言中使用虚拟方法#

C# 在C语言中使用虚拟方法#,c#,C#,我有以下问题。看看我的代码结构。 如果我的所有派生类在过程中都有相同的方法序列(a),这就可以了。但是想象一下我有一个Turtle类,它扩展了Animal,当进程(Animal a)被调用时,里面的方法必须是不同的顺序,Turtle类有一些额外的方法,例如Sleep。 那样的话我该怎么办? 谢谢 公共类动物 { 公共虚拟字符串Eat(){返回“我正在吃”;} 公共虚拟字符串MakeNoise(){返回“我”;} 公共虚拟字符串Go(){return“I'm walking”;} } 公营狗:动物

我有以下问题。看看我的代码结构。 如果我的所有派生类在过程中都有相同的方法序列(a),这就可以了。但是想象一下我有一个Turtle类,它扩展了Animal,当进程(Animal a)被调用时,里面的方法必须是不同的顺序,Turtle类有一些额外的方法,例如Sleep。 那样的话我该怎么办? 谢谢

公共类动物
{
公共虚拟字符串Eat(){返回“我正在吃”;}
公共虚拟字符串MakeNoise(){返回“我”;}
公共虚拟字符串Go(){return“I'm walking”;}
}
公营狗:动物
{
公共重写字符串Eat()
{
返回string.Format(“{0}{1}”,base.Eat(),“一个饼”);
}
公共重写字符串MakeNoise()
{
返回string.Format(“{0}{1}”,base.MakeNoise(),“barking”);
}
}
公共类控制器
{
公共无效程序(动物a)
{
a、 吃();
a、 制造噪音();
a、 去;
}
}
公共类客户端
{
IList animals=new List(){Dog,Cat,海龟,Mouse};//所有动物都有基类Animal
控制器=新控制器();
foreach(动物中的动物a)
{
p、 过程(a);
}
}

您可以添加重载方法

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

可以添加重载方法

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

你可以为自己编写一个控制器工厂,为给定的动物返回一个合适的控制器。为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);
 }

这里工厂的实现很粗糙,但说明了这一点。

您可以编写一个控制器工厂,为给定的动物返回适当的控制器。为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);
 }

工厂在这里的实施是粗糙的,但说明了这一点。

每只动物都有
制造噪音
,和
,但顺序因动物而异(加上某些动物的一些附加行为)。对于给定的动物,顺序是否总是相同的?它们从
动物
继承的唯一原因是它们可以共享相同的基本行为,并且只在需要时重写吗

如果是这样的话,那么控制器中的
过程
方法应该是
动物
上的
ExecuteBehaviors
方法,该方法可以被单个动物覆盖

public virtual void ExecuteBehaviors()
{
    Eat();
    MakeNoise();
    Go();
}
然后,如果动物需要不同的序列,它可以覆盖该方法。 这似乎符合您的问题描述,允许每只动物继承行为,但控制其顺序并添加新行为


然后在控制器中,您可以为每只动物调用
ExecuteBehavior
。这是工作中真正的多态性。你可以对
动物的任何实例进行相同的处理,并对其调用相同的方法,无论是
还是
,即使它们的行为会有所不同。

每种动物都有
制造噪音
,和
,但顺序因动物而异(加上某些动物的一些额外行为)给定动物的序列是否总是相同的?这是它们继承自
动物
的唯一原因,以便它们可以共享相同的基本行为,并且只在需要时重写

如果是这样的话,那么控制器中的
过程
方法应该是
动物
上的
ExecuteBehaviors
方法,该方法可以被单个动物覆盖

public virtual void ExecuteBehaviors()
{
    Eat();
    MakeNoise();
    Go();
}
然后,如果动物需要不同的序列,它可以覆盖该方法。 这似乎符合您的问题描述,允许每只动物继承行为,但控制其顺序并添加新行为


然后在你的控制器中,你只需为每只动物调用
ExecuteBhavior
。这是真正的多态性。你可以对
动物的任何实例进行相同的处理,并对其调用相同的方法,无论它是
狗还是
海龟,即使它们的行为会有所不同。

你有两个选择,第一个一个是扩展Process方法,当a.GetType()==typeof(Turtle)时,可以在内部进行切换并定义顺序

或者您可以让Animal类负责处理方法。
我认为这里的想法不是让Animal类负责处理方法。这是控制器起作用的地方。试着为每个动物使用装饰器模式或工厂,正如@Brett所说,

您有两个选择,第一个是扩展处理方法。当a.GetType()==typeof时,您可以在内部进行切换并定义顺序(乌龟)

或者您可以让Animal类负责处理方法。
我认为这里的想法不是让Animal类负责处理方法。这是控制器起作用的地方。尝试为每个动物使用装饰器模式或工厂,正如@Brett所说,这是在改变
控制器的行为,而不是
动物的行为,因此您需要创建覆盖类型,例如de>TurtleController
这会改变
控制器的行为,而不是
动物的行为,因此您需要创建覆盖类型,例如
TurtleController