首页 新闻 会员 周边

返回自身指针的问题

0
悬赏园豆:50 [已解决问题] 解决于 2010-02-06 22:51

abstract class c1

{

      public c1 returnThis()

  {

    return this;

  }

}

class c2:c1

{

}

 

c2  myclass = new c2();

myclass.returnThis()  //这里返回的指针类型是 c1,我想要它的类型是 c2

 

 

有没有什么办法,无论c1,c2被怎么继承,返回的指针类型都是我调用的那个类,而不是这个函数所在的类

这个怎么写?

问题补充: 理论上返回的肯定是 c1 啊, 指针是指向 c2的,但是类型是c1。 这是正确的 我是想有什么办法能返回c2?
Dozer的主页 Dozer | 初学一级 | 园豆:30
提问于:2010-02-01 11:56
< >
分享
最佳答案
0

同上楼.

有点疑问.难道返回的不是C2吗.C1是抽象类,他的This一定不会是他本身对象的.因为抽象类根本无对象.

代码
abstract class c1
{

public c1 returnThis()
{
return this;
}
public override string ToString()
{
return "c1";
}
}

class c2 : c1
{
public override string ToString()
{
return "c2";
}

}
public static void Main(String[] args)
{
c2 c22
= new c2();
Console.WriteLine(c22.returnThis().ToString());
Console.Read();
}

你的补充: 理论上返回的肯定是 c1 啊, 指针是指向 c2的,但是类型是c1。
这是正确的我是想有什么办法能返回c2?

这个本身就是正常的.就如IList a = new List();

a的实体是List,表现为IList,在C#强类型中.这句话都不会有问题 a as List;

同理,你的c2本身是C2类,只是表现为C1.直接转化就行c2.returnThis() as C2;

有继承关系的那没有转化关系.

在运行时返回C2现我知道的只有通过泛形(可能还有很多我不知道的方法).

    abstract class c1<T> where T:c1<T>
    {

        public T returnThis()
        {
            return this as T;
        }
        public override string ToString()
        {
            return "c1";
        }
    }

    class c2 : c1<c2>
    {
        public override string ToString()
        {
            return "c2";
        }

    }

        public static void Main(String[] args)
        {
            c2 c22 = new c2(); 
            Console.WriteLine(c22.returnThis().GetType());
            c2 c23 = new c2();
            c23 = c22.returnThis() ;//这句话可以直接用了.(不用泛形的话就只有强制转化.)

    //c23 = c22.returnThis() as c2;(没有用泛形时如此用.这个在面向接口编程里是很常用的)
            Console.WriteLine(c23.ToString());
            Console.Read();           
        }

我想这可以达到你的要求了.

收获园豆:50
天天不在 | 小虾三级 |园豆:926 | 2010-02-01 15:29
其他回答(2)
0

那一行返回的是 c2,你可以试一下下面这几句

 

var c = new c2();
Console.WriteLine(c.returnThis().GetType());
Console.ReadKey();
DiryBoy | 园豆:639 (小虾三级) | 2010-02-01 12:03
c1是抽象类,怎么都是返回c2的 若c1不是抽象类,进行以下测试: c2 myC2 = new c2(); Console.WriteLine(myC2.returnThis().GetType().ToString());//返回c2 c1 myC1 = new c2(); Console.WriteLine(myC1.returnThis().GetType().ToString());//返回c2 c1 myRealC1 = new c1(); Console.WriteLine(myRealC1.returnThis().GetType().ToString());//返回c1
支持(0) 反对(0) 泪已凝 | 园豆:200 (初学一级) | 2010-02-10 09:50
0

返回的必然是C2,你有认真测试过么?this是运行时指向当前对象的,不是编译期

Gray Zhang | 园豆:17610 (专家六级) | 2010-02-01 20:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册