C#的类有隐藏和重写,两个的作用其实都是为了实现子类的更改(我是这样认为了),但之间又有区别,隐藏的方法,只能在子类中实现,而重写的方法是可以在父类中得以实现.可能这样说有点玄,举个例子就可很容易说明:
类文件中如下定义:
view plaincopy to clipboardprint?
public class MyTestClass //父类
{
public virtual void WriteLine()
{
Console.WriteLine("MyTestClass");
}
}
public class TestClass1:MyTestClass //隐藏子类
{
new public void WriteLine()
{
Console.WriteLine("MyTestClass1");
}
}
public class TestClass2 : MyTestClass //重写子类
{
public override void WriteLine()
{
Console.WriteLine("MyTestClass2");
}
}
public class MyTestClass //父类
{
public virtual void WriteLine()
{
Console.WriteLine("MyTestClass");
}
}
public class TestClass1:MyTestClass //隐藏子类
{
new public void WriteLine()
{
Console.WriteLine("MyTestClass1");
}
}
public class TestClass2 : MyTestClass //重写子类
{
public override void WriteLine()
{
Console.WriteLine("MyTestClass2");
}
}
然后添加如下执行代码:
static void Main(string[] args)
{
MyTestClass ClassBase1=new TestClass1(); //从子类1中实例化一个父类对象
ClassBase1.WriteLine();
MyTestClass ClassBase2 = new TestClass2(); //从子类2中实例化一个父类对象
ClassBase2.WriteLine();
TestClass1 ClassBase3 = new TestClass1(); //从子类1中实例化一个子类1对象
ClassBase3.WriteLine();
TestClass2 ClassBase4 = new TestClass2(); //从子类2中实例化一个子类2对象
ClassBase4.WriteLine();
Console.ReadLine();
}
static void Main(string[] args)
{
MyTestClass ClassBase1=new TestClass1(); //从子类1中实例化一个父类对象
ClassBase1.WriteLine();
MyTestClass ClassBase2 = new TestClass2(); //从子类2中实例化一个父类对象
ClassBase2.WriteLine();
TestClass1 ClassBase3 = new TestClass1(); //从子类1中实例化一个子类1对象
ClassBase3.WriteLine();
TestClass2 ClassBase4 = new TestClass2(); //从子类2中实例化一个子类2对象
ClassBase4.WriteLine();
Console.ReadLine();
}
出来的结果如下:
MyTestClass
MyTestClass2
MyTestClass1
MyTestClass2
很清楚,当从子类实例化一个父类对象时,隐藏类是不会引影响父类的方法的,但重定就会,如果都是从子类实例化,则新对象都会以子类的新方法执行,也就是说在这种情况下两者是没有区别的,区别只是父类对像的继承上.
如果要在子类中继承父类的代码,再添加代码可以通过base关键字来实现
例如将上面的代码改为
view plaincopy to clipboardprint?
public class MyTestClass
{
public virtual void WriteLine()
{
Console.WriteLine("MyTestClass");
}
}
public class TestClass1:MyTestClass
{
new public void WriteLine()
{
base.WriteLine();
Console.WriteLine("MyTestClass1");
}
}
public class MyTestClass
{
public virtual void WriteLine()
{
Console.WriteLine("MyTestClass");
}
}
public class TestClass1:MyTestClass
{
new public void WriteLine()
{
base.WriteLine();
Console.WriteLine("MyTestClass1");
}
}
运行代码改为:
view plaincopy to clipboardprint?
static void Main(string[] args)
{
MyTestClass ClassBase1=new TestClass1();
ClassBase1.WriteLine();
Console.WriteLine("-------------------------");
MyTestClass ClassBase2 = new TestClass2();
ClassBase2.WriteLine();
Console.WriteLine("-------------------------");
TestClass1 ClassBase3 = new TestClass1();
ClassBase3.WriteLine();
Console.WriteLine("-------------------------");
TestClass2 ClassBase4 = new TestClass2();
ClassBase4.WriteLine();
Console.WriteLine("-------------------------");
Console.ReadLine();
}
static void Main(string[] args)
{
MyTestClass ClassBase1=new TestClass1();
ClassBase1.WriteLine();
Console.WriteLine("-------------------------");
MyTestClass ClassBase2 = new TestClass2();
ClassBase2.WriteLine();
Console.WriteLine("-------------------------");
TestClass1 ClassBase3 = new TestClass1();
ClassBase3.WriteLine();
Console.WriteLine("-------------------------");
TestClass2 ClassBase4 = new TestClass2();
ClassBase4.WriteLine();
Console.WriteLine("-------------------------");
Console.ReadLine();
}
运行结果如下:
MyTestClass
------------------------------------------------
MyTestClass2
------------------------------------------------
MyTestClass
MyTestClass1
------------------------------------------------
MyTestClass2
------------------------------------------------
结果表名,无论是用哪种方法进行继承,用base引用父类原代码都可以.