1. 程式人生 > >C#的繼承、介面、抽象類理解

C#的繼承、介面、抽象類理解

OOP三特性:繼承、封裝、多型

繼承:C#屬於單繼承,即派生類最多隻能有一個直接基類,但可以傳遞繼承,即A類派生B類,B類派生C類,派生類會保留所有基類以及傳遞基類的欄位、屬性、方法等所有內容。如果要在派生類中隱藏基類內容,可以通過new關鍵字實現,或是通過base來呼叫基類的內容

傳遞繼承示例:

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

namespace 繼承
{
    public class Program
    {
        public class A
        {
            public string _fieldA = "A類欄位";
            public int PropertyA { get; set; }
            //如果要提供一個示例方法,則使用virtual關鍵字修飾,派生類如果不重寫virtual方法,則使用基類提供的virtual方法,且必須有對應的實現,重寫則使用重寫方法
            //如果只提供一個規範,則使用abstract關鍵字,注意abstract方法只能在abstract類中使用,而且沒有任何實現,且必須在派生類中重寫,除非派生類也是抽象類(抽象派生類會直接繼承抽象方法而不實現)
            public virtual void FuncA() 
            {
                Console.WriteLine("A類示例方法FuncA");
            }
        }
        public class B : A
        {
            public string _fieldB = "B類欄位";
            public override void FuncA()
            {
                Console.WriteLine("重寫A類方法");
            }
        }
        public class C : B
        {
            public string _fieldC = "C類欄位";
        }

        static void Main(string[] args)
        {
            C c = new C();
            Console.ReadKey();
        }
    }
}

傳遞繼承如圖,例項方法的呼叫必須基於有一個物件,而靜態方法不屬於物件,可以直接呼叫。

抽象類:使用abstract關鍵字建立不完整且必須在派生類中實現的類和class成員。使用sealed可以防止繼承以前標記為virtual的類或某些成員。抽象類用於繼承,故隱式的為public,且不可被private、protected、internal修飾。

注意:1.基類virtual方法若不在派生類中override重寫,則對派生類例項呼叫會使用基類的virtual方法,相當於預定義

          2.若基類virtual方法在派生類override重寫,則對派生類例項呼叫會使用重寫的override方法

          3.抽象方法只能在抽象類中修飾,且沒有實現,結束時一個分號,必須在派生類中override實現

介面:      
          1.由於C#是單繼承,要實現多重繼承可以通過介面實現,C#介面不能有public、private、internal、protected修飾符,介面隱式public
          2.如果介面繼承介面,子介面有與父介面同名方法,可以new隱藏父介面方法

          3.介面無建構函式,不能new來例項化,介面一旦實現,實現類中必須實現介面所有方法,除非實現類是抽象類

區別:介面更多的表是一種can-do的規範,多用於實現多重繼承,且與繼承類關係並不緊密。抽象則類似於IS-A關係,與繼承類關係較為緊密。抽象類不可以new,不可以sealed,介面中繼承父介面的子介面可以通過new來重寫覆蓋同名父方法。兩者都不可以使用private、protected、internal修飾。介面通常用於規範行為,而抽象類是對物件的模擬,例如C#和java都實現oop介面,但C#是MS抽象類,java是sun抽象類

介面示例:

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

namespace 介面和集合
{
    class Program
    {
        //介面解釋和用途:
        //⑴由於C#是單繼承,要實現多重繼承可以通過介面實現,C#介面不能有public、private、internal、protected修飾符,介面隱式public
        //⑵如果介面繼承介面,子介面有與父介面同名方法,可以new隱藏父介面方法
        //⑶介面無建構函式,不能new來例項化,介面一旦實現,實現類中必須實現介面所有方法,除非實現類是抽象類

        //賬戶介面1:通用
        public interface IBankGeneralCustomer
        {
            //存錢
            void Save(double _payMoney);
            //取錢
            bool Withdraw(double _withdrawMoney);
            //餘額
            void Surplus(double _surplusMoney);
        }
        //賬戶介面2:土豪專用
        public interface IBankTuhaoCustomer
        {
            //土豪提醒
            void startReminder(string message);
            void endReminder(string message);
        }
        //屌絲客戶
        public class LiaoRan:IBankGeneralCustomer
        {
            public double  balance { get; set; }

            public void Save(double _payMoney)
            {
                balance = balance + _payMoney;
            }
            public bool Withdraw(double _withdrawMoney)
            {
                if (balance - _withdrawMoney <= 0)
                    return false;
                else
                {
                    balance = balance - _withdrawMoney;
                    Console.WriteLine("取出{0}剩餘{1}", _withdrawMoney, balance);
                    return true;
                }
            }
            public void Surplus(double _surplusMoney)
            {
                Console.WriteLine("餘額{0}", balance);
            }
        }
        //土豪客戶
        public class Guhao:IBankGeneralCustomer,IBankTuhaoCustomer
        {
            public double balance { get; set; }

            public void Save(double _payMoney)
            {
                balance = balance + _payMoney;
            }
            public bool Withdraw(double _withdrawMoney)
            {
                if (balance-_withdrawMoney <= 0)
                    return false;
                else
                {
                    balance = balance - _withdrawMoney;
                    Console.WriteLine("取出{0}剩餘{1}", _withdrawMoney, balance);
                    return true;
                }
            }
            public void Surplus(double _surplusMoney)
            {
                Console.WriteLine("餘額{0}", balance);
            }
            public void startReminder(string message)
            {
                Console.WriteLine("交易開始{0}",message);
            }
            public void endReminder(string message)
            {
                Console.WriteLine("交易結束{0}",message);
            }
        }
        static void Main(string[] args)
        {
            LiaoRan lr = new LiaoRan();
            lr.Save(50.00);
            lr.Withdraw(49.00);
            Guhao gh = new Guhao();
            gh.startReminder("1號臺");
            gh.Save(100.00);
            gh.Withdraw(20.00);
            gh.endReminder("2號臺");
            Console.ReadKey();
        }
    }
}

相關推薦

Java序列化的方式object中的方法介面抽象的區別ArrayList在迴圈過程中刪除

Java序列化的方式 a.是相應的物件實現了序列化介面Serializable,這個使用的比較多,對於序列化介面Serializable介面是一個空的介面,它的主要作用就是標識這個物件時可序列化的,jre物件在傳輸物件的時候會進行相關的封裝。 b.Externlizab

C#中的介面抽象學習

今天學習了介面和抽象類,但並沒有很好的進行整理,所以現在寫的時候,腦子裡多少有點亂亂的,先從介面開始吧。 interface 介面,規定了所有派生類的需要遵循的標準,介面定義了需要做些什麼,但是沒有具體的做法,做法的實現由派生類來做。 介面的定義使用關鍵字Interface,由於需要派生類繼承,所以

一個繼承實現介面抽象是否要重寫其方法

當A類想要實現一個介面中個別方法是(不是所有方法),可以建立一個抽象類去實現該介面,然後在有A類去繼承這個抽象類。注意:這個抽象類必須重寫這個介面的所有方法,A類才可以實現其中的個別方法;如果抽象類沒有實現介面中的所有有方法(不用寫方法體),那麼A類繼承抽象類後就必須重寫抽象

C#的繼承介面抽象理解

OOP三特性:繼承、封裝、多型繼承:C#屬於單繼承,即派生類最多隻能有一個直接基類,但可以傳遞繼承,即A類派生B類,B類派生C類,派生類會保留所有基類以及傳遞基類的欄位、屬性、方法等所有內容。如果要在派生類中隱藏基類內容,可以通過new關鍵字實現,或是通過base來呼叫基類的

2C++】資料抽象/資料封裝/介面抽象

一、C++資料抽象 1、定義     資料抽象是指,只向外界提供關鍵資訊,並隱藏其後臺的實現細節,即只表現必要的資訊而不呈現細節。資料抽象是一種依賴於介面和實現分離的程式設計(設計)技術。     C++類為資料抽象提供了可能。它們向外界提供了大量用於操作物件資料的公共方法,也就

12.抽象匿名內部類繼承介面泛型

類、抽象類、匿名類、內部類、繼承、介面、泛型1.獲得一個類的類物件有哪些方式2.過載(Overload)和重寫(Override)的區別。過載的方法能否根據返回型別進行區分?3.說出幾條 Java 中方法過載的最佳實踐4.抽象類和介面的區別5.抽象類中是否可以有靜態的main

C#介面抽象:Interfaceabstract

一、介面 介面是C#中很常見的工具,概念什麼的就不說了,這裡講幾個值得注意的小地方: 1、介面內部只能有函式、屬性和事件的宣告: <!--<br /> <br /> Code highlighting produced by Actip

【Java】繼承介面抽象多型之間的關係和區別 【一】

時間對於一個追夢的人來說就是黃金,沒有什麼能阻擋前行的腳步。--致所有和我一樣追逐明天太陽的人介面的理解:介面是對動作的抽象說動作還不如說功能   抽象類理解:抽象類是對根源的抽象  多型的理解:類載入執行時父類的引用指向子類的物件 抽象大小關係:介面>抽象類先通過一個

【Java】繼承介面抽象多型之間的關係和區別 【二】

多型:執行時引用指向子元素的例項物件【jvm記憶體模型很重要,也是入門的基礎】 接著上面繼續理解,建立一個老師類   package com.physical; public class Teacher extends Person{ String profession

java介面介面抽象的區別

1、定義           Java介面是一系列方法的宣告,是一些方法特徵的集合,一個介面只有方法的特徵沒有方法的實現,因此這些方法可以在不同的地方被不同的類實現,而這些實現可以具有不同的行為(功能)。 2、Java介面與介面區別

抽象介面委託

抽象類:提供了部分功能的實現,不能被例項化的類,               除了不能被例項化和含有抽象方法,其餘使用和正常類使用一樣。 特點:不能被例項化      

python 抽象抽象方法介面依賴注入SOLIP

python 抽象類、抽象方法、介面、依賴注入、SOLIP    1、程式設計原則:SOLIP SOLIP設計原則   1、單一責任原則(SRP)     一個物件對只應該為一個元素負責   2、開放封閉原則(OCP)     對擴充套件開放,修改封閉   3、里

抽象介面內部類

抽象類 抽象方法和抽象類 抽象方法和抽象類必須使用abstract修飾符來定義,有抽象方法的類只能被定義為抽象類,抽象類裡可以沒有抽象方法; 規則如下: 抽象類與抽象方法必須使用abstract修飾符來修飾,抽象方法不能有方法體; 抽象類不能被例項化。即使抽象類

java介面抽象的區別和作用(功能用途好處)

Java介面: 總結了4點關於JAVA中介面存在的意義:        1、重要性:在Java語言中, abstract class 和interface 是支援抽象類定義的兩種機制。正是由於這兩種機制的存在,才賦予了Java強大的 面向物件能力。

(個人筆記)2018-11-09 包訪問許可權抽象介面final

目錄 包 包-引入包 訪問許可權 抽象類 介面 final 包 包-三大作用 1. 區分相同名字的類 2. 當類很多事,可以很多的管理類 3. 控制訪問範圍 包- 打包命令 package 包名 包-命名規範 字母

java第九天---多型抽象介面各種修飾符的作用及應用場景內部類

1   什麼叫多型     某一個事物,在不同時刻表現出來的不同狀態。貓可以是貓的型別。貓 m = new 貓();  同時貓也是動物的一種,也可以把貓稱為動物。動物 d = new 貓(); 2   多型的前提    

面試準備--介面抽象有什麼區別

對於面向物件程式設計來說,抽象是它的一大特徵之一。在Java中,可以通過兩種形式來體現OOP的抽象:介面和抽象類。 首先,看一下兩者的定義: 抽象類 抽象類是用來捕捉子類的通用特性的 。它不能被例項化,只能被用作子類的超類。抽象類是被用來建立繼承層級裡子類的模板。

基於c# 介面結構的聯絡與區別詳解

本篇文章是對c#中類與介面以及結構的聯絡與區別進行了詳細的分析介紹,需要的朋友參考下 一.C#類與結構的差別1. 值型別與引用型別結構是值型別:值型別在堆疊上分配地址,所有的基型別都是結構型別,例如:int 對應System.int32 結構,string 對應 sy

TypeScript介面繼承

       TS引入了 Class(類)這個概念,作為物件的模板。通過class關鍵字,可以定義類。        基本上,TS的 class 可以看作只是一個語法糖,它的絕大部分功能,ES5 都可以做到,新的 class 寫法只是讓物件原型的寫法更加清晰、

Java基礎學習之介面抽象的概念區別及適用的場景

1.介面   介面是抽象方法的集合,一個介面只有方法的形狀而沒有方法的具體實現,介面是Java面向物件提供的一種機制。   Java語言是一種單繼承的,在類的繼承中通過實現多個介面間接實現了多繼承功能。介面的宣告: [public] interface InterfaceName{