1. 程式人生 > >Python3 與 C# 面向物件之~繼承與多型

Python3 與 C# 面向物件之~繼承與多型

Python的多繼承最好是當C#或者Java裡面的介面使用,這樣結構不會混亂( 特殊情況除外)

來個例子:

class Animal(object):
    pass

class Flyable(object):
    """飛的方法"""
    pass

class Runable(object):
    """跑的方法"""
    pass

class Dog(Animal, Runable):
    pass

class Cat(Animal, Runable):
    pass

class Bird(Animal, Flyable
): pass class Dack(Animal, Runable, Flyable): """鴨子會飛也會跑""" pass

和C#一樣,Python的 父類建構函式不會被繼承

其實從資源角度也不應該被繼承,如果有1w個子類,那每個子類裡面都有一個父類方法,想想這是多麼浪費的一件事情?

2.3.C#繼承

下課後,小明認真思考總結,然後對照Python寫下了C#版的繼承:

定義一個人類

public class Person
{
    public string Name { get; set; }
    public
ushort Age { get; set; } public Person(string name, ushort age) { this.Name = name; this.Age = age; } public void Hi()//People { Console.WriteLine("Name: " + this.Name + " Age: " + this.Age); } public virtual void Show()//People { Console
.WriteLine("Name: " + this.Name + " Age: " + this.Age); } }

定義一個學生類

public class Student : Person
{
    #region 屬性
    /// <summary>
    /// 學校
    /// </summary>
    public string School { get; set; }
    /// <summary>
    /// 班級
    /// </summary>
    public string StrClass { get; set; }
    /// <summary>
    /// 學號
    /// </summary>
    public string StrNum { get; set; }
    #endregion

    #region 建構函式
    /// <summary>
    /// 呼叫父類建構函式
    /// </summary>
    /// <param name="name"></param>
    /// <param name="age"></param>
    public Student(string name, ushort age) : base(name, age)
    {

    }
    public Student(string name, ushort age, string school, string strClass, string strNum) : this(name, age)
    {
        this.School = school;
        this.StrClass = strClass;
        this.StrNum = strNum;
    } 
    #endregion

    /// <summary>
    /// new-隱藏
    /// </summary>
    public new void Hi()//Student
    {
        Console.WriteLine("Name: " + this.Name + " Age: " + this.Age + " School: " + this.School + " strClass: " + this.StrClass + " strNum: " + this.StrNum);
    }
    /// <summary>
    /// override-覆蓋
    /// </summary>
    public override void Show()//Student
    {
        Console.WriteLine("Name: " + this.Name + " Age: " + this.Age + " School: " + this.School + " strClass: " + this.StrClass + " strNum: " + this.StrNum);
    }
}

呼叫一下:

Person p = new Student("app", 10, "北京大學", "001", "01001");
p.Hi(); p.Show();

Console.WriteLine();

Student s = p as Student;
s.Hi(); s.Show();

結果:

Name: app Age: 10
Name: app Age: 10 School: 北京大學 strClass: 001 strNum: 01001
Name: app Age: 10 School: 北京大學 strClass: 001 strNum: 01001
Name: app Age: 10 School: 北京大學 strClass: 001 strNum: 01001

2.4C#介面的多實現

定義兩個介面:

public interface IRun
{
    //什麼都不用加
    void Run();
}

public interface IEat
{
    void Eat();
}

定義一個Dog類來實現兩個介面,這樣dog就有了run和eat的方法了

var dog = new Dog();
dog.Eat();
dog.Run();

結果:

狗狗吃
狗狗跑

3 多型

3.1.Python

說多型之前說說型別判斷,以前我們用 type() or isinstance()

判斷一個變數和另一個變數是否是同一個型別==> type(a)==type(b)

判斷一個變數是否是某個型別==> type(a)==A or isinstance(a,A)

相關推薦

Python3 C# 面向物件繼承

Python的多繼承最好是當C#或者Java裡面的介面使用,這樣結構不會混亂( 特殊情況除外) 來個例子: class Animal(object): pass class Flyable(object): """飛的方法""" pass class Ru

Python3 C# 面向物件封裝

關於__name__在模組呼叫的時候會詳細說,你可以先這樣理解:如果直接執行py檔案就執行,別人呼叫那麼你的main就不執行了 標準寫法: # 1.匯入的模組 # 2.class的定義 # 3.其他方法定義 def main(): pass if __name__ ==

Python3 C# 面向物件異常相關

老師問了小明一聲,有幾個輸出? 小明驕傲的說道:“兩個,我寫了兩個異常處理,當然都執行了” 同學們又笑了,小潘調侃的說了句:“一看就知道去年C#沒好好學,這不都一樣嘛,遇到異常下面程式碼還執行嗎?用腦子好好想想” 當我們認為某些程式碼可能會出錯時,就可以用try來執行這段程式碼,如果執行出錯,則後續

c++面向物件程式設計3 繼承派生

1.繼承:程式碼重用 派生:程式碼的改造 public繼承: 基類的public和protected成員做子類的public和protected成員,而基類的private成員不可直接訪問;基類public成員,子類可以通過子類內部訪問該成員,也可以通過子類物件(類

面向物件封裝、繼承

多型(Polymorphism):意味著可以對不同類的物件使用相同的操作。 封裝(Encapsulation): 即對外部世界隱藏物件的工作細節。 繼承(Inheritance): 以通用的類為基礎建立專門的類物件。 1.封裝 顧名思義就是將內容

面向物件——封裝、繼承

封裝 概念:將類的某些資訊隱藏在類的內部,不允許外部程式直接訪問,而是直接通過該類提供的方法來實現對隱藏資訊的操作與訪問 好處: a. 只能通規定的方法訪問資料 b. 隱藏類的例項細節,方便

Python3 C# 網路程式設計 網路基礎篇

最新版本檢視:https://www.cnblogs.com/dotnetcrazy/p/9919202.html 入門篇 官方文件:https://docs.python.org/3/library/ipc.html(程序間通訊和網路) 例項程式碼:https://github.com/lotapp/

c#面向物件繼承(經驗)

假設有一個基類A,另外有個繼承A的子類B,當建立物件a時===A a = new B();a.PrintObj();=== 用a去呼叫方法PrintObj(),在方法內部會出異常;因為dtObj沒有被例項化;如果去掉A的無參建構函式裡的 註釋,呼叫正確;子類呼叫父類方法,方法類用到的物件必須

Python3 C# 併發程式設計 執行緒上篇

2.2.加強篇¶ 其實以前的Linux中是沒有執行緒這個概念的,Windows程式設計師經常使用執行緒,這一看~方便啊,然後可能是當時程式設計師偷懶了,就把程序模組改了改(這就是為什麼之前說Linux下的多程序程式設計其實沒有Win下那麼“重量級”),弄了個精簡版程序==>執行緒(核心是分不出程序

Python3 C# 併發程式設計程序先導篇

2.2.殭屍程序和孤兒程序¶ 先看看定義: 孤兒程序 :一個父程序退出,而它的一個或多個子程序還在執行,那麼那些子程序將成為孤兒程序。孤兒程序將被init程序(程序號為1)所收養,並由init程序對它們完成狀態收集工作。 殭屍程序 :一個程序使用fork建立子程序,如果子程序退出,而父程序並沒有

Python3 C# 併發程式設計 程序篇

NetCore併發程式設計¶  Python的執行緒、並行、協程下次說 先簡單說下概念(其實之前也有說,所以簡說下): 併發:同時做多件事情 多執行緒:併發的一種形式 並行處理:多執行緒的一種(執行緒池產生的一種併發型別,eg:非同步程式設計) 響應式程式設計:一種程式設計模式,對事件

面向物件_繼承概念

1,如果多個類具有相同的屬性和行為,我們可以抽取出共性的內容定義父類,這時再建立相似的類時只要繼承父類即可。 子類擁有父類的所有屬性與方法,無需重新定義。並且可以直接使用非私有的父類成員。 從邏輯關係來看,子類必須屬於父類的一種時,才應該繼承,且在原有基礎上進行功能擴充套件。

PHP面向物件方法重寫過載

直接程式碼:class father{ public function test(){ echo "father"; } public function tes

C++面向物件的程式設計——繼承

  首先讓我們瞭解一個面向物件程式設計的4個主要特點:抽象,封裝,繼承和多型。其中繼承性和派生性是面向物件程式設計的兩個重要特性。 1.什麼是繼承:    在C++中繼承就是在一個已存在類的基礎上建立一個新類,然後新類可以從已有類那裡獲得它已有的特性。    繼承可以提高程

go語言-面向物件結構體方法(十)

go語言僅支援封裝,不支援繼承和多型type node struct { value int left *node right *node } var root node root = node{value:1} //root := node{value:1} r

python面向物件學習(五)

多型 多型:不同的 子類物件 呼叫相同的 父類方法,產生不同的執行結果 多型 可以 增加程式碼的靈活度 以 繼承 和 重寫父類方法 為前提 是呼叫方法的技巧,不會影響到類的內部設計 多型案例練習 需求 在 Dog 類中封裝方法 game 普通狗只是簡單的玩耍

python中的面向物件學習以及類的

接下來類的第三個重要的特性:多型(一種介面,多種實現) 多型性(polymorphisn)是允許你將父物件設定成為和一個或更多的他的子物件相等的技術,賦值之後,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作。簡單的說,就是一句話:允許將子類型別的指標賦值給父類型別的指標。

初識面向物件三(經典類//鴨子型別/初識封裝)

py2中的經典類 coding:utf-8 class D: pass # def func(self): # print('d')class B(D): pass # def func(self): # print('b')class C(D):

Java第十天學習筆記~面向物件(介面應用、

介面的應用 暴露的規則   使用規則   實現規則 這些裝置和電腦的耦合性降低了 interface USB //暴露的 規則 { public void open(); public void close(); } class BookPC

C語言實現封裝、繼承

雖然C語言一直被稱為面向過程的設計語言,但是通過使用C語言函式指標和結構體的特性,還是能夠使用C語言實現類似面向物件的封裝、繼承和多型的概念。 下面對原始碼進行分析: validator.h檔案 首先提取了所有校驗器都有的校驗方法,定義了一個校驗器抽象類Validato