看来我说的不够明白,题目重写一下(竟然不许编辑) class Base class A1 : Base ... class An : Basefn(Base A) fn(A1 a) ... fn(An a)Base base = new An(); fn(base); //调用的是fn(Base A)怎么让它调用fn(An a) 不要if或者switch的 ========================================= 1,2楼没有实时性 写死的 3楼的方法我试过几种,无法达到效果,能不能说明确些。
没有的话 Base base = new An(); fn(base); //无法编译通过
你还没明白吗? Base base = new An(); 这个你用一个基类变量来做操作,那么后续的操作就应该是对基类的操作,但是你后面的需求又是对子类的操作,你这种设计本身就是有矛盾的。
唉,给你写吧:using System;namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Base b = new A(); fn((A)b); Console.ReadKey(); } private static void fn(Base a) { Console.WriteLine("Base"); } private static void fn(A a) { Console.WriteLine("A"); } } class Base { } class A : Base { }} 在你的问题中先写明这种代码,不累。
class Base
class A1 : Base
...
class An : Basefn(Base A)
fn(A1 a)
...
fn(An a)Base base = new An();
fn(base); //调用的是fn(Base A)怎么让它调用fn(An a)
不要if或者switch的
=========================================
1,2楼没有实时性 写死的
3楼的方法我试过几种,无法达到效果,能不能说明确些。
Base base = new An();
fn(base); //无法编译通过
Base base = new An();
这个你用一个基类变量来做操作,那么后续的操作就应该是对基类的操作,但是你后面的需求又是对子类的操作,你这种设计本身就是有矛盾的。
var base = new An();
fn(base);
我现在用switch实现的选择
switch写的我烦了
我想知道c#中有什么好办法么,要不然重载没什意义,还不如fnA1()...fnAn()更明确些
An base = new An();
是没有一点区别的。
typeof(base)获得An的Type
以后就不知道怎么做了
var base = new An();
fn(base);
这样不行
Base b = new An();
var base = b;
fn(base);
这不是我想要的
C# 4.0限定
Base b = new An();
去构建对象呢?
17楼 这只是个比喻,现在的情况可能更像窗体事件函数的参数 object sender 可能你就明白了
{
class Program
{
static void Main(string[] args)
{
Base b = new A();
fn((A)b);
Console.ReadKey();
}
private static void fn(Base a)
{
Console.WriteLine("Base");
} private static void fn(A a)
{
Console.WriteLine("A");
} } class Base
{
} class A : Base
{
}}
在你的问题中先写明这种代码,不累。
提问题最好是直截了当地写出你的“object sender”,而不需要先过分总结和掩盖具体程序。
fun<A>(A)
fun<An>(A)
但是既然需要运行时的多态,为什么不考虑3L的方案——重写?
在基类中定义虚方法fn,然后各子类重写这个方法就好了嘛。
在整个程序中,我就用if写了这么个“分发函数”(函数名也定义为分发),前面的调用和后面的处理都不归我管。由于派生类有十几个觉得这么处理挺笨的,所以讨论看看有什么“聪明的”办法。我也对后面处理成重载函数有异议,后来想想可能是这么写函数定义时方便。21楼:一排排的else if也没什么好贴的,所以自己简化了贴上来。
22楼:我并不想要什么“万能代码”,但却想知道是不是有像类中虚函数那样的“实时的”选择调用
class A1 : Base
...
class An : Basefun<T>(T arg) where T:Basefun<Base>(a)
fun<A1>(a)
...
fun<An>(a)
我觉得泛型在这用不上
……
else if 是An么
fn((An)a);
……
和
……
else if 是An么
fn<An>(a);
……
对我来说没啥区别。如果尖括号中的类可以用Type类的实例代替那就好了。