具有方法重载的派生类型
本文关键字:派生 类型 重载 有方法 | 更新日期: 2023-09-27 18:06:37
我希望代码足够简单,可以理解。
我试图使用接口类型IColor
,以便将颜色对象传递给ColorManager
。然后,我希望ColorManager
将该对象作为自己的类型传递给IColor
对象,以便调用方法重载。
然而,似乎因为它是作为IColor
类型传递的,c#不会隐式地将其转换为BlueColor
或GreenColor
的完整类型。
我希望这能对我想要达到的目标有所帮助。这在c#中可能吗?
(解决方案)http://msdn.microsoft.com/en-us/library/dd264736.aspx参数类型为dynamic
的重载解析我的代码:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.IO;
namespace Example
{
public interface IColor
{
void CatchColor(IColor c);
}
public class BlueColor : IColor
{
public void CatchColor(IColor c)
{
}
}
public class GreenColor : IColor
{
public void CatchColor(BlueColor c)
{
Console.WriteLine("CAUGHT BLUE!");
}
public void CatchColor(GreenColor c)
{
Console.WriteLine("CAUGHT GREEN!");
}
public void CatchColor(IColor c)
{
Console.WriteLine("CAUGHT SOME COLOR!");
}
}
public class ColorManager
{
public void PassColor(IColor c)
{
// Don't use static type-checking
// Problem solved
dynamic AnyColor = c;
AnyColor.CatchColor(AnyColor);
}
public static void Main()
{
GreenColor G = new GreenColor();
new ColorManager().PassColor(G);
Console.ReadLine();
return;
}
}
}
告诉 ColorManager
类使用传递对象的正确的类型的一种可能性是使用一个已经实现了CatchColor
:
public abstract class IColor
{
// override in every class
public abstract void PrintColor();
// has the correct type passed with the interface
public void CatchColor(IColor c)
{
c.PrintColor();
}
}
那么子类只需要实现具有正确颜色的PrintColor
:
public class BlueColor : IColor
{
public override void PrintColor()
{
Console.WriteLine("BLUE!");
}
}
public class GreenColor : IColor
{
public override void PrintColor()
{
Console.WriteLine("GREEN!");
}
}
经理是一样的:
public class ColorManager
{
public void PassColor(IColor c)
{
c.CatchColor(c);
}
}
可以这样使用:
GreenColor G = new GreenColor();
var cm = new ColorManager();
cm.PassColor(G);
cm.PassColor(new BlueColor());
输出为:
GREEN!
BLUE!
您需要的是后期方法绑定。
这样做的缺点是你必须为每种新类型的颜色添加方法。这样做的好处是你不需要维护case语句或条件逻辑。
请看这里了解更多细节:早绑定和晚绑定
编辑:下面是这种类型的后绑定的工作示例。
class Program {
static void Main(string[] args) {
//Declare instances
BaseClass myClass = new Class2();
BaseClass otherClass = new Class1();
//Invoke the action method which will match based on the BaseClass type
Action(myClass);
Action(otherClass);
Console.ReadLine();
}
public static void Action(BaseClass classType) {
//Remove the compile-time type so the runtime can select the method based on signature
dynamic aClass = classType;
ServiceMethod(aClass);
}
public static void ServiceMethod(dynamic input) {
Methods(input);
}
public static void Methods(Class1 classType) {
Console.WriteLine("Class1");
Debug.WriteLine("Class1");
}
public static void Methods(Class2 classtype) {
Console.WriteLine("Class2");
Debug.WriteLine("Class2");
}
public static void Methods(Class3 classType) {
Console.WriteLine("Class3");
Debug.WriteLine("Class3");
}
}
public abstract class BaseClass { //This could also be an interface
public Guid Id { get; set; }
public string Name { get; set; }
}
public class Class1 : BaseClass {
}
public class Class2 : BaseClass{
}
public class Class3 : BaseClass {
}
所以你需要这样写:
public void CatchColor(Color c)
{
if (c is BlueColor)
CatchColor(c as BlueColor);
if (c is GreenColor)
CatchColor(c as GreenColor);
}
?