protected、public和private,abstract、virtual和override
先看程式。程式是一個計算工資的系統,父類是SalaryClass,子類為SaleSalary。子類在父類基礎上增加了銷售額,按照20%來提成。
父類 SalaryClass
子類SaleSalaryusing 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; } } }
主程式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()); } } }
Bug1:錯誤 當重寫“protected”繼承成員“XXX”時,無法更改訪問修飾符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(); } } }
原因:當把父類中方法修飾符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類的例項,只能被繼承無法例項化
相關推薦
protected、public和private,abstract、virtual和override
先看程式。程式是一個計算工資的系統,父類是SalaryClass,子類為SaleSalary。子類在父類基礎上增加了銷售額,按照20%來提成。 父類 SalaryClass using System; using System.Collections.Generic; u
public,protected,private,static 的區別和呼叫方式
1.public(公共的) 表明該資料成員、成員函式是對所有使用者開放的,所有使用者都可以直接進行呼叫 2.protected(受保護的) 是受訪問許可權顯示的,不同包中的非子類是不能訪問的 default 是受訪問許可權顯示的,不同包中的子類不能訪問 3.
如何整合內心的衝突和混亂,構建、形成自己的思維體系?
正文開始前,說點題外話。 今天本來想發另一篇原創文章的,但想起來我在上一篇文章裡曾經承諾過,會寫一寫如何如何整合思想,搭建思維框架。 於是決定還是更新這篇大幹貨。 特別要說明的是,這篇文章裡的核心內容我曾經作為壓軸放在自己的書裡了,但很多人看了後反映說一知半解。 所以,這一次
【陌上軒客】技術領域:涉獵Java、Go、Python、Groovy 等語言,高效能、高併發、高可用、非同步與訊息中介軟體、快取與資料庫、分散式與微服務、容器和自動化等領域; 興趣愛好:籃球,騎行,讀書,發呆; 職業規劃:勵志成為一名出色的伺服器端系統架構師。
陌上軒客 技術領域:涉獵Java、Go、Python、Groovy 等語言,高效能、高併發、高可用、非同步與訊息中介軟體、快取與資料庫、分散式與微服務、容器和自動化等領域; 興趣愛好:籃球,騎行,讀書,發呆; 職業...
二叉樹(先、中、後、層次遍歷,判斷同構和是否為完全二叉樹)
二叉樹基本操作 二叉樹的結構定義 二叉樹的建立(遞迴) 訪問節點 先序遍歷 中序遍歷 後序遍歷 層次遍歷 判斷是否同構 判斷一顆二叉樹是否為完全二叉樹 二叉樹的結構定義
android studio設定主題、護眼色、字型、Logcat前景色背景色、建立類時,新增作者名和日期等
1、設定主題 按快捷鍵Ctrl+Alt+s,開啟settings視窗。再選擇Apprearance,選擇自己喜歡的主題,預設兩款,一個白,一個黑。我選擇的是白色預設。如圖: 2、設定護眼色 護眼
abstract不能和private,static以及final同時使用的原因
bstract 一定不能和 private, static, final 同時使用.1、抽象方法:只有方法頭,沒有方法體定義,也就是說抽象方法無需實現,抽象方法的意義在於子類實現,private意義在於其他類直接呼叫它已實現的方法。這兩者搭配毫無意義(private修飾後為私
JS( +號操作符)、自加一,自減一 ( ++和- -)、(比較操作符)、邏輯與操作符
JS( +號操作符):操作符是用於在JavaScript中指定一定動作的符號。(1)操作符看下面這段JavaScript程式碼。sum = numa + numb;其中的"="和"+"都是操作符。JavaScript中還有很多這樣的操作符,例如,算術操作符(+、-、*、/等)
深度優先搜尋中的樹邊、後向邊,前向邊和交叉邊
樹邊:深度優先樹中的邊,已生成的邊(如圖中的實線邊) 後向邊:不在深度優先樹中的邊,但由樹中的頂點指向其父頂點或者是指向頂點本身的邊(圖中的虛線邊B) 前向邊:不在深度優先樹中的邊,但由樹中的頂點指向其子輩頂點的邊(圖中的虛線邊F) 交叉邊:除樹邊、後向邊、前向邊以外的邊(
leetcode-1:python基礎,迴圈、條件、列表、字典的應用,enumerate、range函式以及2.0和3.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逐
封裝和private,this關鍵字的簡單應用
變量 簡單應用 一個 創建 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 installer、executable installer、embeddable zip file,x86、x86-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編碼下CString、char*、BSTR相互轉換,char*、wchar_t*相互轉換
1、Unicode編碼下CString轉為char* 方法一:使用API:WideCharToMultiByte進行轉換<span style="font-size:18px;">#i