方法重载的派生类型

乔斯

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

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

但是,似乎由于将其作为IColor类型传递,因此C#不会将其隐式转换为aBlueColor完整类型GreenColor

我希望这对我想要实现的目标有意义。这在C#中可能吗?

[解决方案] http://msdn.microsoft.com/zh-cn/library/dd264736.aspx动态类型的参数的重载解析

到目前为止,我的代码:

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;
        }
    }
}
xDaevax

您想要的是后期方法绑定。

不利的一面是您必须为每种新型颜色添加方法。好处是您不必维护案例陈述或条件逻辑。

有关更多详细信息,请参见此处:早期和晚期绑定

编辑:这是这种后期绑定的有效示例。

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 {
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

用派生类调用重载方法

来自分类Dev

用派生类调用重载方法

来自分类Dev

派生类型的构造方法

来自分类Dev

具有重载分配的嵌套派生类型

来自分类Dev

具有重载分配的嵌套派生类型

来自分类Dev

派生类型的呼叫扩展方法

来自分类Dev

通过派生类型调用的静态方法

来自分类Dev

派生类不继承基类的重载方法

来自分类Dev

具有派生类的CRTP重载方法

来自分类Dev

无法在C ++的派生类中重载基类方法

来自分类Dev

SignalR派生类型

来自分类Dev

SignalR派生类型

来自分类Dev

从基类和派生类之外的方法返回任何派生类类型

来自分类Dev

将派生类型1的派生类型作为参数传递时,双向隐式可转换类型的重载之间的歧义调用

来自分类Dev

实现派生类构造函数时出错:“没有重载函数的实例与指定类型匹配

来自分类Dev

Fortran派生类型:重载的赋值运算符不适用于'PARAMETER'属性

来自分类Dev

允许将派生类型强制转换为父类型以返回“对象”,但使用派生类型的方法

来自分类Dev

如何在派生类型中使用泛型方法

来自分类Dev

返回派生类类型的基类中的方法?

来自分类Dev

返回派生类型的基类中的C#方法

来自分类Dev

如何在派生类型中使用泛型方法

来自分类Dev

从类型为基类的向量访问派生类方法

来自分类Dev

在派生类中重载了最终函数

来自分类Dev

派生类的重载解析失败

来自分类Dev

派生类的运算符重载

来自分类Dev

派生类中的重载构造函数

来自分类Dev

如何在python中相同的重载派生类方法中调用基类方法?

来自分类Dev

PostgreSQL中的派生类型

来自分类Dev

Fortran派生类型分配

Related 相关文章

热门标签

归档