亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

自定義轉換和重載運算符

自定義轉換和重載運算符,這兩章節看的不是很明白。有沒有具體的案例或者更加詳細的說明一下?

正在回答

2 回答

我在收看的教程視頻是,把代碼也給敲出來了,里面有相應的注釋,分享一下吧

using System;
using System.Globalization;
using System.Net.Cache;

namespace PetShop
{
??? interface ICatchMice //基類中接口的定義
??? {
??????? void ICatchMice();
??? }
??? interface IClimbTree //基類中接口的定義
??? {
??????? void IClimbTree();
??? }
??? abstract public class Pet
??? {
??????? public int _age;
??????? public string _name;//設置為public或者protected,以便于子類訪問
??????? public Pet(string name)//構造一個方法
??????? {
??????????? _name = name;
??????????? _age= 0;
??????? }
??????? public static Pet operator ++ (Pet pet)//重裝運算符定義
??????? {
??????????? ++pet._age;
??????????? return pet;
??????? }
??????? public void PrintName()
??????? {
??????????? Console.WriteLine("Pet's name is " + _name);
??????? }
??????? public void ShowAge()
??????? {
??????????? Console.WriteLine(_name+"'s Age="+_age);
??????? }
??????? abstract public void Speak();
??????? /*上面這句話 是抽象方法的應用例子,之前版本 虛方法:
???????? virtual public void Speak()
???????? {
??????????? Console.WriteLine(_name+"is speaking ");
????????? }???????
????????
???????? */
??????

??? }
??? static class PetGuide
??? {
??????? static public void HowToFeedDog(this Dog dog)
??????? {
??????????? Console.WriteLine("Play a vedio about how to feed a dog");
??????? }
??????? static public void HowToFeedCat(this Cat cat)
??????? {
??????????? Console.WriteLine("Play a vedio about how to feed a cat");
??????? }
??? }
??? public class Dog:Pet //繼承的應用
??? {
??????? static int Num;//靜態類的應用
??????? static Dog()//靜態構造方法的定義
??????? {
??????????? Num = 0;
??????? }

??????? public Dog(string name):base(name)//顯式調用基類構造函數
??????? {
??????????? ++Num;
??????? }
??????? new public void PrintName()//重定義函數,隱藏功能實例
??????? {
??????????? Console.WriteLine("寵物的名字叫 " + _name);
??????? }
??????? //sealed public override void Speak()//重寫抽象函數,用override在派生類中被繼承,
??????? //如果加上sealed關鍵字,那么在Dog的子類Hashiqi里重寫Speak函數就會出錯,sealed是密封的意思,不能被重寫
??????? public override void Speak()//重寫抽象函數,用override在派生類中被繼承
??????? {
??????????? Console.WriteLine(_name + " is speaking"+":wowo");
??????? }
??????? static public void ShowNum()//靜態構造方法的調用
??????? {
??????????? Console.WriteLine("Dog's number:" + Num);
??????? }
??????? /*public static implicit operator Dog(Cat cat)//隱式轉換的定義,目的在于把貓貓變成狗狗,
??????? {
??????????? return new Dog(cat._name);
??????? }*/
??? }
???
??? class Cat :Pet,ICatchMice, IClimbTree //子類中接口的調用
??? {
??????? public Cat(string name) : base(name)
??????? {
??????? }
??????? public override void Speak()
??????? {
??????????? Console.WriteLine(_name + " is speaking" + ":mewo");
??????? }
??????? public void ICatchMice()//子類中接口的調用
??????? {
??????????? Console.WriteLine(_name+"can catch mice");
??????? }
??????? public void IClimbTree()//子類中接口的調用
??????? {
??????????? Console.WriteLine(_name+"can climb tree");
??????? }
??????? public static implicit operator Cat(Dog dog)//隱式轉換的定義,目的在于把狗狗變成貓貓,
??????? {
??????????? return new Cat(dog._name);
??????? }

??? }
??? class Hashiqi:Dog
??? {
??????? public Hashiqi(string name) : base(name)
??????? {
??????? }
??????? new public void PrintName()
??????? {
??????????? Console.WriteLine("二哈的名字叫 " + _name);
??????? }
??????? public override void Speak()
??????? {
??????????? Console.WriteLine(_name + " is speaking" + ":wowu");
??????? }

??? }
??? class Program
??? {
??????? static void Main(string[] args)
??????? {
????????? Pet[] pets=new Pet[] {new Dog("Jack"),new Cat("Tom"),new Hashiqi("wangcai"),new Hashiqi("Chaijiazhe")};
??????????? for(int i=0;i<pets.Length;i++)
??????????? {
??????????????? pets[i].PrintName();
??????????????? pets[i].Speak();
??????????? }
??????????? Cat c = new Cat("Tom2");
??????????? ICatchMice catchM = (ICatchMice)c;//強制轉換c為接口類型
??????????? c.ICatchMice();//通用接口調用
??????????? catchM.ICatchMice();//通用接口調用
??????????? IClimbTree climbT = c;//也可不用轉換,本身就是一個引用類型
??????????? c.IClimbTree();
??????????? climbT.IClimbTree();

??????????? /* Dog dog = new Dog();
???????????? dog.Name = "Jack";
???????????? dog.PrintName();
???????????? Cat cat = new Cat();
???????????? cat.Name = "Tom";
???????????? cat.PrintName();
???????????? Hashiqi erha = new Hashiqi();
???????????? erha.Name = "wangcai";
???????????? erha.PrintName();*/
??????????? Dog dog0 = new Dog("tony");
??????????? Dog dog1 = new Dog("tommy");
??????????? dog0.HowToFeedDog();
??????????? dog1.HowToFeedDog();

??????????? Console.WriteLine("下面輸出的是自定義轉換的實例調用");
??????????? dog1.Speak();
??????????? Cat cat = dog1;
??????????? cat.Speak();

??????????? Dog.ShowNum();//靜態方法調用
??????????? c.HowToFeedCat();
??????????? Console.WriteLine();

??????????

??????????? for (int j = 0; j < pets.Length; j++)
??????????? {
??????????????? ++pets[j];//這里的 ++ 就是重裝運算符,根據定義,pet的年齡加1,返回pet,
??????????????? pets[j].ShowAge();
??????????? }
???????
??????? }
??? }
}


1 回復 有任何疑惑可以回復我~

重載運算符那章就是把++運算符進行重載,讓++運算符明確為++pet._age;(就是寵物的年齡),這樣下面調用++方法的時候,動物的_age就會執行++運算。

0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
C#面向對象編程
  • 參與學習       69207    人
  • 解答問題       160    個

本系列教程主要是,帶你學習C#面向對象編程的編程思想、編程技巧

進入課程

自定義轉換和重載運算符

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號