第6章 通路權限控制

引言:通路權限(或隐藏具體實作)與“最初的實作并不恰當”有關。

先了解兩個概念:

封裝(encapsulation),即隐藏對象的屬性和實作細節,僅對外公開接口。

重構(refactoring),就是通過調整程式代碼改善軟體的品質、性能,使其程式的設計模式和架構更趨合理,提高軟體的擴充性和維護性。

程式員分為兩類,類庫的消費者和類庫的開發者,類庫的消費者希望類庫出現新版本的時候,他們并不需要改寫他們的代碼,而類庫的開發者則必須有權限對類庫進行修改和改進,而不影響用戶端程式員。

這就要求我們将“變動的事物”與“保持不變的事物”區分開來。

這正是通路權限的作用所在。

包提供了一個管理命名空間的機制。目的是将所有類成員的名稱彼此隔離。

包名的命名規範參見前面的文章http://blog.csdn.net/qq_18738333/article/details/49828349

編譯單元是一個帶字尾名.java的檔案,編譯單元内隻能有一個public類,且該類的名稱必須與檔案名相同。編譯一個.java檔案,其中的每個類都會生成一個字尾名為.class的檔案。

java可運作程式是一組可以打包并壓縮為一個java文檔檔案(jar,使用java的jar生成器)的.class檔案。java解釋器負責對這些檔案的尋找、裝載和解釋。

類庫是一組類檔案,每個檔案都有一個public類,以及任意數量的非public檔案,用關鍵字package組合到一起。

package語句必須作為檔案的第一個非注釋語句出現,表明該編譯單元是某個類庫的一部分,但使用一個類庫時,必須用import語句導入。

需要記住:package和import語句關鍵字允許你做的,是将單一的全局名字空間分割開,使得無論多少人在使用internet和java編寫類,都不會出現名稱沖突的問題。

1. 包通路權限

2. public:接口通路權限

3. protect:繼承通路權限

4. private:私有

獲得通路權限的方法有這些:

(1) 使成員成為“public”(公共的)。這樣所有人從任何地方都可以通路它。

(2) 舍棄所有通路訓示符,并将其類置于相同的包内。這樣一來,包内的其他類就可以通路成員。

(3) 繼承的類既可以通路一個protected成員,也可以通路一個public成員(但不可通路private成員)。

(4) 提供“通路器(accessor)/變異器(mutator)”方法(亦稱為“擷取(get)/設定(set)”方法),以便讀取和修改值。這是oop環境中最優雅的一種方法。

不多累贅,隻記錄需要注意的用法:

1. 預設包為包内的檔案提供了包通路權限

2. 類的通路權限隻有包通路權限和public兩種選擇。

3. 如果想控制如何建立對象,并阻止别人通路某個特定的構造器(或者全部構造器),可以使用private修飾構造器,用一個static方法控制建立對象。這就是單例模式(singleton)。這是很常見的設計模式,比如遊戲引擎中的導演類。

看下面這段代碼

java 資料安全/隐私保護 程式員 開發者 設計模式 通路控制權限 權限控制通路權限 限制通路權限 控制通路權限
最近更新

第6章 通路權限控制

引言:通路權限(或隐藏具體實作)與“最初的實作并不恰當”有關。

先了解兩個概念:

封裝(encapsulation),即隐藏對象的屬性和實作細節,僅對外公開接口。

重構(refactoring),就是通過調整程式代碼改善軟體的品質、性能,使其程式的設計模式和架構更趨合理,提高軟體的擴充性和維護性。

程式員分為兩類,類庫的消費者和類庫的開發者,類庫的消費者希望類庫出現新版本的時候,他們并不需要改寫他們的代碼,而類庫的開發者則必須有權限對類庫進行修改和改進,而不影響用戶端程式員。

這就要求我們将“變動的事物”與“保持不變的事物”區分開來。

這正是通路權限的作用所在。

包提供了一個管理命名空間的機制。目的是将所有類成員的名稱彼此隔離。

包名的命名規範參見前面的文章http://blog.csdn.net/qq_18738333/article/details/49828349

編譯單元是一個帶字尾名.java的檔案,編譯單元内隻能有一個public類,且該類的名稱必須與檔案名相同。編譯一個.java檔案,其中的每個類都會生成一個字尾名為.class的檔案。

java可運作程式是一組可以打包并壓縮為一個java文檔檔案(jar,使用java的jar生成器)的.class檔案。java解釋器負責對這些檔案的尋找、裝載和解釋。

類庫是一組類檔案,每個檔案都有一個public類,以及任意數量的非public檔案,用關鍵字package組合到一起。

package語句必須作為檔案的第一個非注釋語句出現,表明該編譯單元是某個類庫的一部分,但使用一個類庫時,必須用import語句導入。

需要記住:package和import語句關鍵字允許你做的,是将單一的全局名字空間分割開,使得無論多少人在使用internet和java編寫類,都不會出現名稱沖突的問題。

1. 包通路權限

2. public:接口通路權限

3. protect:繼承通路權限

4. private:私有

獲得通路權限的方法有這些:

(1) 使成員成為“public”(公共的)。這樣所有人從任何地方都可以通路它。

(2) 舍棄所有通路訓示符,并将其類置于相同的包内。這樣一來,包内的其他類就可以通路成員。

(3) 繼承的類既可以通路一個protected成員,也可以通路一個public成員(但不可通路private成員)。

(4) 提供“通路器(accessor)/變異器(mutator)”方法(亦稱為“擷取(get)/設定(set)”方法),以便讀取和修改值。這是oop環境中最優雅的一種方法。

不多累贅,隻記錄需要注意的用法:

1. 預設包為包内的檔案提供了包通路權限

2. 類的通路權限隻有包通路權限和public兩種選擇。

3. 如果想控制如何建立對象,并阻止别人通路某個特定的構造器(或者全部構造器),可以使用private修飾構造器,用一個static方法控制建立對象。這就是單例模式(singleton)。這是很常見的設計模式,比如遊戲引擎中的導演類。

看下面這段代碼

Winform重画ComboBox背景色

//返回hWnd参数所指定的窗口的设备环境。
 [System.Runtime.InteropServices.DllImport("user32.dll")]
        static extern IntPtr GetWindowDC(IntPtr hWnd);     

        [System.Runtime.InteropServices.DllImport("user32.dll")]
        //函数释放设备上下文环境(DC)  
        static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);    
        int WM_PAINT = 0xf; //要求一个窗口重画自己,即Paint事件时         


        /// <summary>
        /// 
        /// </summary>
        /// <param name="m"></param>
        protected override void WndProc(ref Message m)
        { 

            base.WndProc(ref m);
            if (m.Msg == WM_PAINT)
            {
                IntPtr hDC = GetWindowDC(m.HWnd);
                if (hDC.ToInt32() == 0) //如果取设备上下文失败则返回     
                {
                    return;
                }

                PaintComboBox(Graphics.FromHdc(hDC));
                ReleaseDC(m.HWnd, hDC);
            }
        }      
private void PaintComboBox(Graphics g)
        {
            g.SmoothingMode = SmoothingMode.HighQuality;
            g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;


            int iDropDownButtonWidth = 17;
            int iDropDownButtonHeight = this.Height;
            int iDropDownButtonLocatinX = 17;
            int iDropDownButtonLocatinY = 0;
            
            if (!Util.PublicFunction.IsHigherWinXP())
            {
                iDropDownButtonWidth = 17;
                iDropDownButtonHeight = this.Height-2;
                iDropDownButtonLocatinX = 19;
                iDropDownButtonLocatinY = 1;
            }
            //下拉按钮
            Rectangle dropDownRectangle = new Rectangle(ClientRectangle.Width - iDropDownButtonLocatinX, iDropDownButtonLocatinY, iDropDownButtonWidth, iDropDownButtonHeight);


            //背景色刷
            Brush bkgBrush;

            //字体色刷
            Brush fcBrush;

            //设置背景色和字体色
            bkgBrush = new SolidBrush(this._backColor);
            fcBrush = new SolidBrush(this._foreColor);

            //画3D边框
            //ControlPaint.DrawBorder3D(g, new Rectangle(0, 0, this.Width, this.Height), Border3DStyle.SunkenInner, Border3DSide.All);


            int iBackColorX = 0;
            //为了字体正常,Enable时只是重画按钮区域
            if (this.Enabled)
            {
                iBackColorX = this.Width - 20;
            }
            //画背景
            g.FillRectangle(bkgBrush, iBackColorX, 0, ClientRectangle.Width, ClientRectangle.Height);

            //为了字体正常,Disable时才重画文本
            if (!this.Enabled)
            {
                //画文本
                g.DrawString(base.Text, this.Font, fcBrush, 2, this.ClientSize.Height / 2, new StringFormat() { LineAlignment = StringAlignment.Center });
            }

            //画边框
            //g.DrawRectangle(_BorderPen, new Rectangle(0, 0, this.Width, this.Height));
            ControlPaint.DrawBorder(g, new Rectangle(0, 0, this.Width, this.Height), borderColor, ButtonBorderStyle.Solid);

            //画下拉按钮
            if (Util.PublicFunction.IsHigherWinXP())
            {
                ControlPaint.DrawComboButton(g, dropDownRectangle, this.Enabled ? System.Windows.Forms.ButtonState.Flat : System.Windows.Forms.ButtonState.All);
            }
            else
            {
                ComboBoxRenderer.DrawDropDownButton(g, dropDownRectangle, this.Enabled ? ComboBoxState.Normal : ComboBoxState.Disabled);
            }

            g.Dispose();
            bkgBrush.Dispose();
            fcBrush.Dispose();

        }