具有方法重载的派生类型

本文关键字:派生 类型 重载 有方法 | 更新日期: 2023-09-27 18:06:37

我希望代码足够简单,可以理解。

我试图使用接口类型IColor,以便将颜色对象传递给ColorManager。然后,我希望ColorManager将该对象作为自己的类型传递给IColor对象,以便调用方法重载。

然而,似乎因为它是作为IColor类型传递的,c#不会隐式地将其转换为BlueColorGreenColor的完整类型。

我希望这能对我想要达到的目标有所帮助。这在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);
    }

?