zoukankan      html  css  js  c++  java
  • 关于“重写”和“隐藏”,override和new的区别(转)

    注意:TextBox4Sql的做法很白痴,这种问题应该交给SQL层去维护,而不是UI上。

    OOP这么久,一直很少用到new关键字“隐藏”父类的成员。直到有一天,需要改造一个TextBox的Text属性。由于原先的代码中调用SQL语法直接将TextBox.Text属性作为varchar类型的数据合并成SQL语句,从来没有对其中的字符串进行过特殊符号的过滤,于是我在一个文本框里输入了“'”(单引号),可想而知的结果,SQL异常。但是这种SQL调用的方法在代码中比比皆是,于是,打算重新打造TextBox,使它在读取Text属性时,将其中的第个单引号替换成两个,使SQL语法正确。 第一个的TextBox4Sql类:

    1. using System.Windows.Forms;   
    2.   
    3. namespace WindowsFormsApplication1   
    4. {   
    5.     public class TextBox4Sql : TextBox   
    6.      {   
    7.         public override string Text   
    8.          {   
    9.             get  
    10.              {   
    11.                 return base.Text.Replace("'", "''");   
    12.              }   
    13.             set  
    14.              {   
    15.                 base.Text = value;   
    16.              }   
    17.          }   
    18.   
    19.   
    20.         public string RealText   
    21.          {   
    22.             get  
    23.              {   
    24.                 return base.Text;   
    25.              }   
    26.             set  
    27.              {   
    28.                 base.Text = value;   
    29.              }   
    30.          }   
    31.      }   
    32. }   

    重写了父类的Text属性,使得获取时将其中每个单引号替换为两个单引号(11行)。但是有的时候需要得到原本的文本内容,于是写了RealText新属性,直接返回父类的Text属性内容(24行)。遗憾的是,我们用override关键字重写了父的Text属性,RealText返回的内容会是我们第11行代码处理过的。显然,我该使用new关键字,而不是override重写Text。

    new关键字使TextBox4Sql类的Text属性是覆盖掉原先由父类继承来的Text,但是父类的Text(base.Text)仍然有效;这不同于override,如果父类的成员采用virtual关键字修饰,那么它是希望被子类override重写的,重写意味着被完全替换的效果,因此,只要将上面重写的Text属性关键字override替换为new,就可以使RealText属性返回原本的父类Text内容。或者我们期望RealText属性被子类重写,那就加入virtual关键字吧。

    1. using System.Windows.Forms;   
    2.   
    3. namespace WindowsFormsApplication1   
    4. {   
    5.     public class TextBox4Sql : TextBox   
    6.      {   
    7.         public new string Text   
    8.          {   
    9.             get  
    10.              {   
    11.                 return base.Text.Replace("'", "''");   
    12.              }   
    13.             set  
    14.              {   
    15.                 base.Text = value;   
    16.              }   
    17.          }   
    18.   
    19.   
    20.         public virtual string RealText   
    21.          {   
    22.             get  
    23.              {   
    24.                 return base.Text;   
    25.              }   
    26.             set  
    27.              {   
    28.                 base.Text = value;   
    29.              }   
    30.          }   
    31.      }   
    32. }   

    还需要解释一下,new是可以隐藏掉任何父类的成员的。override可以重写由virtual、abstract或者override修饰的成员,所以我们称override为重写。

  • 相关阅读:
    Integration Services学习(3):数据流任务(下) (转自游子吟)
    delete和truncate的区别
    Integration Services 学习(6):包配置 (转自游子吟)
    SSIS 学习(2):数据流任务(上) (转自游子吟)
    Integration Services 学习(5):容器 (转自游子吟)
    Integration Services 学习(4):变量和表达式 (转自游子吟)
    in与exist , not in与not exist 的区别
    SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY
    关于Reporting Services的Q&A
    SSIS 学习(1) 概要 (转自游子吟)
  • 原文地址:https://www.cnblogs.com/IcefishBingqing/p/1825997.html
Copyright © 2011-2022 走看看