abstract class c1
{
public c1 returnThis()
{
return this;
}
}
class c2:c1
{
}
c2 myclass = new c2();
myclass.returnThis() //这里返回的指针类型是 c1,我想要它的类型是 c2
有没有什么办法,无论c1,c2被怎么继承,返回的指针类型都是我调用的那个类,而不是这个函数所在的类
这个怎么写?
同上楼.
有点疑问.难道返回的不是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();
}
我想这可以达到你的要求了.
那一行返回的是 c2,你可以试一下下面这几句
var c = new c2();
Console.WriteLine(c.returnThis().GetType());
Console.ReadKey();
返回的必然是C2,你有认真测试过么?this是运行时指向当前对象的,不是编译期