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