1. 程式人生 > >protected、public和private,abstract、virtual和override

protected、public和private,abstract、virtual和override

先看程式。程式是一個計算工資的系統,父類是SalaryClass,子類為SaleSalary。子類在父類基礎上增加了銷售額,按照20%來提成。

父類 SalaryClass

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
   
        class SalaryClass
        {
            protected int baseWage = 3000;
            protected int normaltime = 22;
            protected double ratio = 1.5;
            //public string position;
        //    public int seniority;
            public string name;
            public int overTime;
            public int coWorker;
           public virtual void Input()
            {
                Console.WriteLine("輸入姓名: ");
               name= Console.ReadLine();
               Console.WriteLine("輸入加班時間: ");
               overTime = Convert.ToInt32(Console.ReadLine());
               Console.WriteLine("輸入同事評價: ");
               coWorker = Convert.ToInt32(Console.ReadLine());
              // position = "Manager";
              // seniority = 20;


                   
            }
          public virtual void GetSalary()
            {
                Console.WriteLine( this.name + "的工資是:" + arithmetic() + "元");
            }
          protected virtual double arithmetic()
            {
                double finalSalary = 0;
                finalSalary += baseWage;
                finalSalary += (overTime / normaltime) * baseWage * ratio;
                finalSalary += (coWorker / 4) * finalSalary;
                return finalSalary;
                   
            }
        
    }
}
子類SaleSalary
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    class SaleSalary:SalaryClass
    {
        public double saleRoom;
        protected override double arithmetic()
        {
            double re = base.arithmetic();
            re += saleRoom * 20/100;
            return re;

        }
      public   override void GetSalary()
        {
            Console.WriteLine(this.name + "的工資是:" + arithmetic() + "元");
        }
        public override void Input()
        {
            base.Input();
            Console.WriteLine("輸入銷售額: ");
            saleRoom =Convert.ToDouble( Console.ReadLine());
        }
    }
}
主程式
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            SalaryClass salaryproject = new SalaryClass();
            salaryproject.Input();
            salaryproject.GetSalary();
            SaleSalary salesalary = new SaleSalary();
            salesalary.Input();
            salesalary.GetSalary();

        }
    }
}
Bug1:錯誤  當重寫“protected”繼承成員“XXX”時,無法更改訪問修飾符  

原因:當把父類中方法修飾符public改為protected時會出現此錯誤。這裡要明確override的含義。通常來說,我們要求訪問修飾符的限制一定要大於被重寫方法的訪問修飾符,比如說父類是protected,子類應該是public而不能是private。但是override的含義是重寫,所謂重寫也叫覆寫,修飾符、返回型別、引數就是要和父類一摸一樣才叫覆寫,意思是說各個地方都需要完美的蓋住。所以在父類中為public,子類中也必須為public;父類中為protected,子類中也必須為protected。

Bug2:錯誤 “XXX”不可訪問,因為它受保護級別限制 

原因:把父類子類中相應的Input方法都改為protected,按Bug1所說就可以了,但還是會報錯。這裡的原因在於對protected的含義理解錯誤。當方法宣告為protected時,可以在本類和子類中訪問,但是例項不能訪問。從main程式來看,是將類給例項化了,所以Input和GetSalary方法不能夠為protected,必須為public。

事實上,對於工資計算系統來說,我們不希望使用者看到的屬性是基礎工資、正常工作天數等 ,因此arithmetic方法是protected型別的,而Input方法是與使用者互動的,GetSalary方法是呈現最終工資的,這兩種方法沒必要隱藏,故為public。

再提一下abstract和virtual的區別。

如果子類中要使用override重寫父類中的方法,則父類中需要被重寫的方法必須加abstract或者virtual限定符。abstract和virtual的共同點在於用來修飾方法時,前面必須加public,因為虛擬方法或抽象方法是不能私有的。區別在於

(1)virtual是虛擬的,因此其修飾的方法必須有實現(僅僅新增一對大括號也算是實現);而abstract是抽象的,其修飾的方法一定不能實現。

(2)virtual可以被子類重寫,而abstract必須被子類重寫。

(3)如果類成員被abstract修飾,則該類前必須新增abstract,因為只有抽象類才有抽象方法。

(4)無法建立abstract類的例項,只能被繼承無法例項化





相關推薦

protectedpublicprivateabstractvirtualoverride

先看程式。程式是一個計算工資的系統,父類是SalaryClass,子類為SaleSalary。子類在父類基礎上增加了銷售額,按照20%來提成。 父類 SalaryClass using System; using System.Collections.Generic; u

publicprotectedprivatestatic 的區別呼叫方式

1.public(公共的)     表明該資料成員、成員函式是對所有使用者開放的,所有使用者都可以直接進行呼叫 2.protected(受保護的)    是受訪問許可權顯示的,不同包中的非子類是不能訪問的 default 是受訪問許可權顯示的,不同包中的子類不能訪問 3.

如何整合內心的衝突混亂構建形成自己的思維體系?

正文開始前,說點題外話。 今天本來想發另一篇原創文章的,但想起來我在上一篇文章裡曾經承諾過,會寫一寫如何如何整合思想,搭建思維框架。 於是決定還是更新這篇大幹貨。 特別要說明的是,這篇文章裡的核心內容我曾經作為壓軸放在自己的書裡了,但很多人看了後反映說一知半解。 所以,這一次

【陌上軒客】技術領域:涉獵JavaGoPythonGroovy 等語言高效能高併發高可用非同步與訊息中介軟體快取與資料庫分散式與微服務容器自動化等領域; 興趣愛好:籃球騎行讀書發呆; 職業規劃:勵志成為一名出色的伺服器端系統架構師。

陌上軒客 技術領域:涉獵Java、Go、Python、Groovy 等語言,高效能、高併發、高可用、非同步與訊息中介軟體、快取與資料庫、分散式與微服務、容器和自動化等領域; 興趣愛好:籃球,騎行,讀書,發呆; 職業...

二叉樹(先層次遍歷判斷同構是否為完全二叉樹)

二叉樹基本操作 二叉樹的結構定義 二叉樹的建立(遞迴) 訪問節點 先序遍歷 中序遍歷 後序遍歷 層次遍歷 判斷是否同構 判斷一顆二叉樹是否為完全二叉樹 二叉樹的結構定義

android studio設定主題護眼色字型Logcat前景色背景色建立類時新增作者名日期等

1、設定主題 按快捷鍵Ctrl+Alt+s,開啟settings視窗。再選擇Apprearance,選擇自己喜歡的主題,預設兩款,一個白,一個黑。我選擇的是白色預設。如圖: 2、設定護眼色  護眼

abstract不能privatestatic以及final同時使用的原因

bstract 一定不能和 private, static, final 同時使用.1、抽象方法:只有方法頭,沒有方法體定義,也就是說抽象方法無需實現,抽象方法的意義在於子類實現,private意義在於其他類直接呼叫它已實現的方法。這兩者搭配毫無意義(private修飾後為私

JS( +號操作符)自加一自減一 ( ++- -)(比較操作符)邏輯與操作符

JS( +號操作符):操作符是用於在JavaScript中指定一定動作的符號。(1)操作符看下面這段JavaScript程式碼。sum = numa + numb;其中的"="和"+"都是操作符。JavaScript中還有很多這樣的操作符,例如,算術操作符(+、-、*、/等)

深度優先搜尋中的樹邊後向邊前向邊交叉邊

樹邊:深度優先樹中的邊,已生成的邊(如圖中的實線邊) 後向邊:不在深度優先樹中的邊,但由樹中的頂點指向其父頂點或者是指向頂點本身的邊(圖中的虛線邊B) 前向邊:不在深度優先樹中的邊,但由樹中的頂點指向其子輩頂點的邊(圖中的虛線邊F) 交叉邊:除樹邊、後向邊、前向邊以外的邊(

leetcode-1:python基礎迴圈條件列表字典的應用enumeraterange函式以及2.03.0print的區別

題目: Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each

判斷是否為今年是否為今天是否為昨天比較當前時間from時間的差值

效果圖: 時間處理樣式: 1:建立NSDate的擴充套件類   NSDate+LMExtension.h // Created by limin on 16/6/21. // Copyright © 2016年 limin. All rights reserved.

題目三:給定一個數組值可以為正0請返回累加為給定值k的最長子陣列長度。

import java.util.HashMap; /** * * 2、給定一個數組,值可以為正、負和0,請返回累加和為給定值k的最長子陣列長度。 * 咱們可以反推,比如:1- 100,陣列和為1000. * 要求最長和為300的子陣列,我可以反著求第一

題目四:給定一個數組值可以為正0請返回累加小於等於k的最長子陣列長度。 時間複雜度:O(n)

import java.util.HashMap; /** * * 3、給定一個數組,值可以為正、負和0,請返回累加和小於等於k的最長子陣列長度。 時間複雜度:O(n) * * 這裡需要分為兩步,第一步是獲取,以每個位置開頭最小和的長度。第二步,從0到N逐

封裝privatethis關鍵字的簡單應用

變量 簡單應用 一個 創建 int .get new 內部 ret 1.將成員變量用private修飾 2.提供對應的getxx()和setxx()方法 1 public class Student { 2 3 private String name;

五十七檢視模板配合使用缺一不可MVT綜合案例

一、檢視函式的使用 注意:檢視函式必須有一個引數request,進行處理之後,需要返回一個HttpResponse的類物件, hello python就是返回給瀏覽器顯示的內容。 1、在專案的views.py 檔案中寫入函式 2、進行url配置:建立url地址和檢視的對應關

python官網下載windows版本時各檔案的區別:web-based installerexecutable installerembeddable zip filex86x86-64

python官網下載windows版本時,存在web-based installer、executable installer、embeddable zip file,x86、x86-64等多種檔案,如下圖: 下載連結1:https://www.python.org/downloads/

bash學習之一:登陸非登陸shell互動非互動shell以及它們的startup檔案

家目錄下的配置檔案.bashrc中rc的含義是resource configuration 什麼是登陸shell?什麼是非登陸shell? 登陸shell是指:(1)使用者登陸時,輸入使用者名稱和密碼後啟動的shell;(2)通過帶--login引數的命令:bash --lo

C語言中的常量變數及其屬性型別儲存空間

部落格源地址  http://www.codertown.cn/blog/?p=134 常量和變數其實就是C語言裡的值,其他程式語言同樣存在,這個跟數學裡的是一樣的。 1、常量 固定的值,不可改變的值是常量,幾種型別: 在表示式中直接用數值表示;巨集定義當然也是

Word術語A4(210×297)上下3.8cm右3.2cm頁首頁尾3.0cm如何在LaTeX中設定

某學位論文要求: A4(210×297),幅面白色,上、下3.8cm,左、右3.2cm,頁首、頁尾3.0cm 那麼如何在LATEX中實現呢?首先你必須要明白Word術語和LATEX關於頁面設定術語的對應關係才能明白如何寫出LATEX程式碼。 1

Unicode編碼下CStringchar*BSTR相互轉換char*wchar_t*相互轉換

1、Unicode編碼下CString轉為char* 方法一:使用API:WideCharToMultiByte進行轉換<span style="font-size:18px;">#i