抽象类,接口....弄了一天,把自己弄晕了...

gold_star85 2009-07-18 03:54:00
-------上代码:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication6
{
class Program
{
static void Main(string[] args)
{
iicar mycar = new middlecar();
mycar.ReduceWheel();
Console.WriteLine(mycar.Wheel);
Console.ReadKey();
}
}

internal abstract class car : iicar
{
private int wheel;

public int Wheel
{
get { return this.wheel; }
set { this.wheel = value; }
}

public abstract int AddWheel();

public virtual void ReduceWheel()
{
this.wheel--;
}
}

internal class middlecar : car
{
private int wheel = 4;
public override int AddWheel()
{
return ++this.wheel;
}

public new int Wheel
{
get { return this.wheel; }
set { this.wheel = value; }
}

public override void ReduceWheel()
{
this.wheel = this.wheel - 2;
}

}

interface iicar : icar
{
int AddWheel();
void ReduceWheel();
}

interface icar
{
int Wheel
{
get;
set;
}
}
}


我觉得输出应该是 2 吧,结果..是 0 ..为什么啊????????
...全文
134 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hide1984 2009-07-19
  • 打赏
  • 举报
回复
这是.NET的早帮定和晚绑定的问题
其实你在Car类中和MiddleCar类中定义的Wheel属性,无论你怎么写

1. Car中 public int Wheel
MiddleCar中 public int Wheel(注意,这样写会有警告,但是不会报错)
2. Car中 public int Wheel
MiddleCar中 public New int Wheel
3. Car中 public virtual int Wheel
MiddleCar中 public New int Wheel
最后调到的mycar.Wheel都是调用父类,也就是Car的Wheel,这个Wheel只有申明,没有复制,默认初始化为0
这个叫早帮定,也就是编译的时候就决定了调用的是Car的Wheel

而晚绑定要这样写。
Car中 public virtual int Wheel
MiddleCar中 public Override int Wheel
此时,编译器发现有Virtual/Override配套关键字,那么它调用的就是类申明类型的字段,而是实例化这个类的字段,也就是用MiddleCar来实例话,那么调到的Wheel自然是MiddleCar中的Wheel了~


不知道这样说楼主明白否,楼主可以去搜索一下,关于.net的早绑定和晚绑定~~~
chen_ya_ping 2009-07-18
  • 打赏
  • 举报
回复
或者你也可以把你的car中的Wheel字段改成virtual的,在middlecar中重写就可以了。
chen_ya_ping 2009-07-18
  • 打赏
  • 举报
回复
Console.WriteLine(((middlecar)mycar).Wheel);就可以得到2了。
slund 2009-07-18
  • 打赏
  • 举报
回复
接口本身不包括方法的实现,接口的属性和方法要由继承它的类来实现,而这里继承iicar这个接口的类car本身是个抽象类,它的addwheel方法是抽象方法,要由继承它的类middlecar的addwheel方法来实现。
gold_star85 2009-07-18
  • 打赏
  • 举报
回复
我好象明白了,接口类型里面的Wheel是不会有什么值的.我这里想获得mycar.Wheel的值,自然,他会找iicar的实现类,也就是car,然后,把car里面的Wheel值输出来.恩.谢谢大家了.先放在这里,明天来结贴.
marcoak 2009-07-18
  • 打赏
  • 举报
回复
iicar mycar = new middlecar();
你这句错了. 你这个是实例化父类, 由子类实现. 父类有的并不会被子类重写.
还有 public new int Wheel 是重新分配一个空间. 不会重写父类的属性.
改成实例化子类就对了.
middlecar mycar = new middlecar();
gold_star85 2009-07-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 vicqqq 的回复:]
因为你middlecar的Wheel隐藏了基类的Wheel
iicar mycar = new middlecar();
mycar的Wheel是基类的Wheel,就是car的Wheel是0
[/Quote]

接口iicar被抽象类car实现,也就是说,这里
iicar mycar = new middlecar();
就等于:
car mycar = new middlecar();
是这个意思吗?
iyori 2009-07-18
  • 打赏
  • 举报
回复
private int wheel = 4;
父类和子类的 wheel 都是私有的
paulin 2009-07-18
  • 打赏
  • 举报
回复
如果楼主想要通过多态获得运行时类型,访问实例属性活方法
那么父类的Wheel也许要声明称虚方法
wo554006164 2009-07-18
  • 打赏
  • 举报
回复
看你这个程序,我昏了.
vicqqq 2009-07-18
  • 打赏
  • 举报
回复
因为你middlecar的Wheel隐藏了基类的Wheel
iicar mycar = new middlecar();
mycar的Wheel是基类的Wheel,就是car的Wheel是0
gold_star85 2009-07-18
  • 打赏
  • 举报
回复
恩.知道程序是怎么走的了.难道说,接口定义的类型,只能直接找到实现它的类??没听过这个属性.....
conanlwl 2009-07-18
  • 打赏
  • 举报
回复
你自己先试着跟踪调试一下吧..@_@
conanlwl 2009-07-18
  • 打赏
  • 举报
回复
你自己先试着跟踪调试一下吧..@_@
IHandler 2009-07-18
  • 打赏
  • 举报
回复
iicar mycar = new middlecar() as iicar;
IHandler 2009-07-18
  • 打赏
  • 举报
回复
在属性Wheel和方法ReduceWheel中设断点调试
gold_star85 2009-07-18
  • 打赏
  • 举报
回复
没有人看吗????这个应该不是什么很高深的东西吧....分少,可我心诚啊...
SATAN1122 2009-07-18
  • 打赏
  • 举报
回复
不明白··帮顶~

62,266

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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