yzx99

导航

 

目前,基类的所有公开的数据成员与成员函数,以及所有protected的数据成员与成员函数都会被子类一一继承。但会不会有时候要把基类的一些接口给屏蔽掉呢?好像是没什么具体实例,但了解一下也是可以的。
查网络上的一些方法,一般是方法重写,里面什么内部都没有。这样说来,也只是基类如果执行该方法,编译器是不会报错的,只是没有任何语句在里面执行而已。方法重写时,基类方法要标为virtual,子类的方法标为override,这样即可。
using System;

static class m
{
 static void Main()
 {
  rectpoint rp=new rectpoint(12, 15);
  rp.show();  //编译通过,但没有代码可执行
  rp.showxy();
 }
}

class point
{
 protected int m_x;
 protected int m_y;

 public virtual void show()
 {
   Console.WriteLine("x=" + m_x.ToString() + " y=" + m_y.ToString());
 }
}

class rectpoint:point
{
 public rectpoint(int x0, int y0)
 {
  m_x=x0;
  m_y=y0;
 }

 public override void show() {}
 
 public void showxy()
 {
  Console.WriteLine("(x, y)=(" + m_x.ToString() + ", " + m_x.ToString() + ")");
 }
}
另一种方法,是使用new关键字。这种写法在父类中不必写virtual。而且,这一种方法可以在想调用父类对应方法时,还有机会调用:
using System;

static class m
{
 static void Main()
 {
  rectpoint rp=new rectpoint(12, 15);
  rp.show();  //编译通过,但没有代码可执行
  rp.showxy();
  ((point)rp).show();  //调用父类的方法
 }
}

class point
{
 protected int m_x;
 protected int m_y;

 public void show()
 {
   Console.WriteLine("x=" + m_x.ToString() + " y=" + m_y.ToString());
 }
}

class rectpoint:point
{
 public rectpoint(int x0, int y0)
 {
  m_x=x0;
  m_y=y0;
 }

 public new void show() {}
 
 public void showxy()
 {
  Console.WriteLine("(x, y)=(" + m_x.ToString() + ", " + m_x.ToString() + ")");
 }
}
别人说的一种应用情况是这样的:甲先创建父类,乙从父类继承出子类,然后加了一个特别好的功能show,过了一段时间,甲发现show真的很有必要,于是就在父类中加入show,这样,世界就乱了,乙的代码必须重写,至少要把show改为override。如果使用new,则避免这种问题的发生,父类再怎么加同名方法,子类都不会受影响。所以只要是增加父类没有的方法,就应该用new来说明。但我实际测试时,编译器会提出一个警告:p.cs(37,18): warning CS0109: 成员“rectpoint.showxy()”不会隐藏继承的成员。不需要关键字 new。这多少让人会感到不爽。

不过我还没找到能够在IDE中把父类的方法不显示的办法。(vb中有Shadows,MSIL有hidebysig)

posted on 2008-05-29 10:59  yzx99  阅读(675)  评论(2编辑  收藏  举报