主頁 > 軟體工程 > 實體與繼承

實體與繼承

2021-11-09 08:39:50 軟體工程

我正在學習 c# 并且無法理解與實體相比繼承有哪些用例?

為了把它放在背景關系中,我正在制作一個控制臺 rpg,我目前的理解是我應該制作一個超類/基類npc,我從中繼承 3 個子類magepaladin并且thief,我每個實體High level magelow level mage.

它有意義還是我的邏輯有問題?在繼承/實體交換的情況下,這也會反過來作業嗎?

uj5u.com熱心網友回復:

將實體與繼承進行比較類似于比較蘋果和橙子。他們或多或少是不相關的。繼承用于定義類定義的層次結構,而實體是當您創建這些類之一的實際實體時。

一(但遠遠不是唯一的),你要問自己,若考慮繼承是正確的選擇是做子類和超類份額時,問題是一個關系?如果答案是肯定的,您可能想要使用繼承。如果答案是否定的,那么您幾乎肯定不會。

給大家舉幾個例子。

問:一個類是否與一個類Mercedes共享一個關系Car
答:也許吧!更有可能的是,您只是擁有一個Car具有屬性的類MakeModel等等)。

問:一個MyWebPage份額是一個帶班的關系BaseWebPage
答:也許,是的。這是使用繼承的一種常見方式。MyWebPage覆寫基類的一些功能來控制渲染(作為一個例子)

回到你的例子。Class MageShare anNpc...關系嗎?答案是另一個“Maybe”。為了使使用繼承有意義,您Mage必須覆寫的一些基本功能Npc- 您可能有類似Car上面示例的內容。

uj5u.com熱心網友回復:

我不明白繼承的用例。這就是困擾我的原因

您對另一個答案發表了此評論;該答案討論了何時確定繼承的候選者,而 OneCricketeer 的答案討論了一個示例繼承層次結構,但您可能仍然想知道“有什么意義?”

從本質上講,關鍵是當您不在乎了解事物的詳細資訊時,它允許您以共同的方式對待事物。你不需要知道你手中的東西是刀、抹刀、信用卡等,以便能夠用它在三明治上涂抹蛋黃醬;我提到的所有這些東西都可以合理地用來舀起蛋黃醬并將其攤開。它們可以根據一些基本特性以通用方式進行處理,這些特性使它們成為良好的吊具(直邊、相當剛性的主體、防水和防油)

因此,假設您有自己的角色型別,并且它們都來自 NPC。假設每種玩家都有Health,當它達到 0 時,他們就死了。因為所有角色都有生命值,所以把它放在 NPC 上可能是有意義的。也許不同種類的角色有不同的起始生命值:

class Npc{
  public int Health{get;set;}
}

class Medic:Npc{
  Medic(){
    Health = 30;
  }
}

class Soldier:Npc{
  Soldier(){
    Health = 80;
  }
}

假設你的玩家組織了一個部落/團隊/團隊,所以你的程式有:

var team = new Npc[10];

您的團隊中最多可以擁有 10 種角色,并且可以任意組合。繼承這個東西就是一個Soldier是一個Npc,一個Medic是一個Npc,所以現在你制作了一個Npc陣列,你可以在里面塞入士兵和醫生:

team[0] = new Soldier();
team[1] = new Medic();

假設有人向團隊投擲炸彈,它會對每個人的健康造成 55 點傷害。它會直接殺死一個新的醫生。我們不需要知道他們是什么樣的球員;所有 Npc 都有生命值,在這個通用的“從他們身上取一些生命值”場景中,醫生和士兵都可以被視為 Npc:

void DropBombOn(Npc[] team){
  foreach(var npc in team) {
    npc.Health -= 25;
    if(npc.Health <= 0)
      Console.WriteLine("Character is dead");
  }
}

但是哪個角色已經死了讓我們修改類:

class Npc{
  public int Health{get;set;}
  public string Name{get;set;}
}

設定它們:

team[0] = new Soldier("john");
team[1] = new Medic("fred");


class Medic:Npc{
  Medic(string name){
    Health = 30;
    Name = name;
  }
}

class Soldier:Npc{
  Soldier(string name){
    Health = 80;
    Name = name;
  }
}


void DropBombOn(Npc[] team){
  foreach(var npc in team) {
    npc.Health -= 55;
    if(npc.Health <= 0)
      Console.WriteLine("Character called "   npc.Name   " is dead");
  }
}

你可以添加另一種型別的角色,他們仍然是一個 Npc,所以他們可以像其他所有角色一樣被轟炸..

Inheritance allows us to treat very specific types as something more general if there are operations that can take place in a general sense, on the general properties that all those kinds of things have.

Maybe all players have a bitmap image within their class that represents them. You can draw the team on screen by visiting each one and saying "give me your pixels"; you don't need to visit each one and say "if this npc is a medic, draw a medic. If this npc is a soldier draw a soldier.." - you just draw whatever pixels they give you and every different player gives different pixels. That, in essence is what we did with name - all characters have a name, we didn't care about which name we got; we just asked and printed out what we got

Another useful thing is that classes can have methods that override (replace) those on the base classes. Here we make a method that describes the character. We put it on the Npc, which means it will be available for anything that inherits from an Npc. We mark it abstract which means "anything that inherits from Npc must provide a method that does something, called DescribeYourself":

public class Npc{
  public int Health{get;set;}
  public string Name{get;set;}
  public abstract void DescribeYourself();
}


public class Medic:Npc{
  public Medic(string name){
    Health = 30;
    Name = name;
  }

  public override string DescribeYourself(){
    return "I'm a medic called "   Name;
  }

}

public class Soldier:Npc{

  public string ServiceNumber {get; set;}

  public Soldier(string name,string serviceNumber){
    Health = 80;
    Name = name;
  }

  public override string DescribeYourself(){
    return "I'm a soldier with service number "   ServiceNumber   " and I ain't telling you anything else";
  }
}


void DropBombOn(Npc[] team){
  foreach(var npc in team) {
    npc.Health -= 55;
    if(npc.Health <= 0)
      Console.WriteLine(npc.DescribeYourself()   " and I'm dead");
  }
}

This time we didn't pull the name/print a common message - we asked the npc to describe itself. If it's a Soldier, the soldier version of the code runs and we see I'm a soldier with service number " ServiceNumber " and I ain't telling you anything else and I'm dead in the console. If it's a medic theyre a bit more forthcoming with info :)

We also have to provide a service number when we make a Soldier. This outlines that different kinds of classes can have different data requirements/more or less data during setup and use, but we can still treat them in a common way

The term for this "treat in a common way" is polymorphism and it's perhaps one of the most powerful things about C#.. In a practical sense, for example, Microsoft can provide a Stream class that, basically, writes bytes to somewhere, and then loads of inherited classes can write bytes to different places. We now have streams that can write bytes to.. the console, to a file, to some dropbox storage, to memory, to a string... And they're all used in the same way and the person calling write doesn't care how many hoops the code has to jump through to write to console vs file vs FTP server.. They just call Write with the expectation that the bytes will end up in the place promised. You can write you own streams, and hand them to Microsoft's classes - Microsoft's classes knew nothing關于你的類,但你仍然可以要求一個位圖將自己保存到你的流中,也許你的流類接受它并將位元組添加到電子郵件中并發送它......突然間你可以讓位圖自己寫入電子郵件和位圖可以完全不知道電子郵件是什么,但它仍然可以寫入。你可以完全不知道塞尺什么,但你可以用它來傳播蛋黃醬。

uj5u.com熱心網友回復:

默認情況下,所有都繼承Object

為了使用非抽象類(或任何繼承的類),您需要創建一個實體。

實體保存欄位并定義函式,這些函式可以充當存盤在該實體中的其他實體的包裝器/訪問器(稱為組合)。


對于給定的示例,假設 NPC 具有級別。然后所有子類都從它擴展,因此繼承了它的屬性。法師(和其他型別)有自己的屬性

class NPC {
  int Level { get; set; }
  
  public NPC(int level) {
    Level = level;
  }
}

class Mage : NPC {
  String PrimaryMagic {get; set; }
 
  public Mage(int level, string magic) : base(level) {
    PrimaryMagic = magic;
  } 
}
var lowMage = new Mage(1, "fire");
var highMage = new Mage(50, "ultima");

但是你也可以制作一個沒有特定屬性的通用等級角色

var nobody = new NPC(0);

您還可以取消 Mage 類并為所有 NPC 提供一些Spells串列屬性,例如默認為空/空。

var magicStudent = new NPC(1); // starts with no magic
// .. Game progresses
if (magicStudent.Level >= 5) {
  magicStudent.Spells.Add("cure"); // Based on some condition, update a list of spells. 
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/353481.html

標籤:C# 遗产 实例

上一篇:C#HttpClient檢測重定向

下一篇:如何單擊鏈接并在新選項卡中打開它SeleniumWebDriverC#

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more