用什么方法可以实时的把基类转换成子类

yinshi2012 2012-06-29 05:37:45
class Base
class A : Base

fn(Base A)
fn(A a)

Base base = new A();
fn(base); //调用的是fn(Base A)

怎么让它调用fn(A a)
不要if或者switch的
...全文
342 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
iyomumx 2012-07-01
  • 打赏
  • 举报
回复
Microsoft.VisualBasic.Interaction.CallByName(提供fn的对象实例,"fn",1,a)

记得引用Microsoft.VisualBasic.dll
yinshi2012 2012-06-30
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 的回复:]
class Base
class A1 : Base
...
class An : Base

fun<T>(T arg) where T:Base

fun<Base>(a)
fun<A1>(a)
...
fun<An>(a)
[/Quote]

我觉得泛型在这用不上
……
else if 是An么
fn((An)a);
……

……
else if 是An么
fn<An>(a);
……
对我来说没啥区别。如果尖括号中的类可以用Type类的实例代替那就好了。
yinshi2012 2012-06-30
  • 打赏
  • 举报
回复
24楼:3楼的方案我试过了,但由于改动量和范围问题,不可能。反射会有用么因为GetMethod的时候还是要用字符串指明的。而且反射能用在这种情况么,我只在需要dll文件时用过。

我不想指指点点别人写的好坏,只是要对一个基类引用的派生类实例处理,并且这种处理又需要派生类特有的属性或方法时,我只想到多重选择转换没有别的。所以才发了这贴想和大家讨论一下有没有更好的办法。
xboxeer 2012-06-30
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 的回复:]
与其说想获得帮助,我更想发起讨论,但是由于言不达意使大家没明白我的意思,也没达到我想要的结果。
在整个程序中,我就用if写了这么个“分发函数”(函数名也定义为分发),前面的调用和后面的处理都不归我管。由于派生类有十几个觉得这么处理挺笨的,所以讨论看看有什么“聪明的”办法。我也对后面处理成重载函数有异议,后来想想可能是这么写函数定义时方便。

21楼:一排排的else if也没什么好贴的,所以……
[/Quote]
class Base
class A1 : Base
...
class An : Base

fun<T>(T arg) where T:Base

fun<Base>(a)
fun<A1>(a)
...
fun<An>(a)
yinshi2012 2012-06-30
  • 打赏
  • 举报
回复
与其说想获得帮助,我更想发起讨论,但是由于言不达意使大家没明白我的意思,也没达到我想要的结果。
在整个程序中,我就用if写了这么个“分发函数”(函数名也定义为分发),前面的调用和后面的处理都不归我管。由于派生类有十几个觉得这么处理挺笨的,所以讨论看看有什么“聪明的”办法。我也对后面处理成重载函数有异议,后来想想可能是这么写函数定义时方便。

21楼:一排排的else if也没什么好贴的,所以自己简化了贴上来。
22楼:我并不想要什么“万能代码”,但却想知道是不是有像类中虚函数那样的“实时的”选择调用
iyomumx 2012-06-30
  • 打赏
  • 举报
回复
LZ需要的,是运行时的重载决策。在没有实现DLR的C# 3.5,只能用反射。
但是既然需要运行时的多态,为什么不考虑3L的方案——重写?
在基类中定义虚方法fn,然后各子类重写这个方法就好了嘛。
xboxeer 2012-06-30
  • 打赏
  • 举报
回复
用泛型吧 fun<T>(T A) where T:Base
fun<A>(A)
fun<An>(A)
sp1234_maJia 2012-06-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
class Base
class A : Base

fn(Base A)
fn(A a)

Base base = new A();
fn(base); //调用的是fn(Base A)

怎么让它调用fn(A a)
不要if或者switch的
[/Quote]


“实时性”?你发明的这个词儿跟你的问题描述自相矛盾。你在描述问题是说是“让他调用fn(A a)”,然后又说自己这种脑袋所能说出的意思是“没有实时性”的,这不就是自相矛盾了嘛!

你自己都是自相矛盾的,所说的话根本是前后不一致,觉得还有希望别人给你写出什么“万能”的代码能够解决你根本说不清需求的问题吗?
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]

16楼 4.0限定的没法了 本人3.5
17楼 这只是个比喻,现在的情况可能更像窗体事件函数的参数 object sender 可能你就明白了
[/Quote]

提问题最好是直截了当地写出你的“object sender”,而不需要先过分总结和掩盖具体程序。
  • 打赏
  • 举报
回复
唉,给你写吧:
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
{
}

}


在你的问题中先写明这种代码,不累。
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
class Base
class A : Base

fn(Base A)
fn(A a)

[/Quote]

这能编译?

你写个能编译通过的程序出来。
yinshi2012 2012-06-30
  • 打赏
  • 举报
回复
16楼 4.0限定的没法了 本人3.5
17楼 这只是个比喻,现在的情况可能更像窗体事件函数的参数 object sender 可能你就明白了
ParanoidKing 2012-06-29
  • 打赏
  • 举报
回复
为什么非得用
Base b = new An();
去构建对象呢?
iyomumx 2012-06-29
  • 打赏
  • 举报
回复
((dynamic)this).fn(base);

C# 4.0限定
yinshi2012 2012-06-29
  • 打赏
  • 举报
回复
12楼的办法仅限 这样
var base = new An();
fn(base);
这样不行
Base b = new An();
var base = b;
fn(base);
这不是我想要的
yinshi2012 2012-06-29
  • 打赏
  • 举报
回复
我的10楼回复怎么没了
yinshi2012 2012-06-29
  • 打赏
  • 举报
回复
倒是可以
typeof(base)获得An的Type
以后就不知道怎么做了
ParanoidKing 2012-06-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
引用 9 楼 的回复:

那这样吧
var base = new An();
fn(base);

这样的写法和
An base = new An();
是没有一点区别的。
[/Quote]

没错,不过看lz的意思就是这样,不然谁这么写重载的
cheng2005 2012-06-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

那这样吧
var base = new An();
fn(base);
[/Quote]
这样的写法和
An base = new An();
是没有一点区别的。
yinshi2012 2012-06-29
  • 打赏
  • 举报
回复
我当然明白
我现在用switch实现的选择
switch写的我烦了
我想知道c#中有什么好办法么,要不然重载没什意义,还不如fnA1()...fnAn()更明确些
加载更多回复(9)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧