C#中类的隐藏和重写的区别

 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引用父类原代码都可以.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值