C# 面向物件:類、根據不同操作符操作兩個變數
類
1、當使用類時,應新增一個新類
2、類名首字母需大寫
3、欄位用來儲存資料,private;屬性用來保護欄位;介面、建構函式、方法
public struct1
{ // 自動屬性:雖然沒有寫欄位,但是還是會生成欄位
get;
set;
}
4、類寫好後,需要建立物件: Classes cl=new Classes( ); // Classes是自定義的類名
new關鍵字的作用:1、在堆中開闢空間 2、在開闢空間中建立物件 3、呼叫物件的建構函式(建構函式必須為public,初始化物件)
5、static、 抽象類不可以建立物件;
在類中 this.name ,this指當前類的物件(如下面程式碼)
6、靜態類的成員被修飾時,呼叫類名.靜態成員名 ;非靜態呼叫:物件名.非靜態成員名 / 物件名.例項成員
This 的用法:
第一個用法:
public void print() { string name = "vivi"; Console.WriteLine("{0}",this.name); // 在這個函式中,本來是列印物件的name,如果不加this進行限定的話,直接列印的為變數的值。 }
第二個用法:
呼叫自己的建構函式
public class void initial(int n1,int n2,int n3,int n4 ,int n5) { this.N1=n1; this.N2=n2; this.N3=n3; this.N4=n4; this.N5=n5; } public class void initial(int n1,int n2,int n3) :this(n1,n2,n3,0,0) // 呼叫自己全參的建構函式 { }
7、繼承單一性、傳遞性;介面可以有多個繼承;子類沒法繼承父類的欄位(private),子類沒有繼承父類的建構函式,而是預設會呼叫父類按個無引數的構 造函式,若父類的建構函式重寫了,自動替換掉父類的無引數的預設建構函式,子類無法呼叫父類的預設無引數的建構函式,出現異常,需要子類重新寫一個建構函式。子類先建立一個父類物件,在子類中呼叫父類的建構函式,使用base()
繼承:方法
8、子類可以複製給父類;如果父類裝的是子類,可以將父類轉換為子類;
如果兩個類有繼承關係,子類既可以使用自己的成員,也可以使用從父類繼承的成員。但是父類永遠只能使用自己的成員。
子類之間也不能相互使用對方的成員。
public class student:person
{ }
person ps=new student(); //ps表現的是父類的型別,裝的是子類的物件。-- 父類。
student st=(student)person;
或者使用as來轉換:
stduent st1 = ps as student;// 使用as來轉換的話,轉換成功,返回轉換後的物件;轉換失敗,返回null。
或者使用is做判斷
if( ps is student) { } // 如果可以轉換,返回true;否則返回false
object類是所有類的父類。
9、虛方法和抽象類
如果父類有意義,可以建立方法進行呼叫。可以使用virtual;
如果父類不知道方法如何實現,可使用抽象類abstract;
虛擬成員或抽象成員不能是私有的。
以前都是面向過程,現在是面向物件--類;
例子:實現根據不同操作符計算兩個int的操作;// 本處用兩個int型;
1、Program.cs
namespace calculator
{
class Program
{
static void Main(string[] args)
{
//建立一個面向物件的,兩個數字的運算;
Console.WriteLine("請輸入要計算的第一個數字");
int num1=Convert.ToInt32(Console.ReadLine ());
Console.WriteLine("請輸入要計算的第二個數字");
int num2 = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("請輸入運算子");
string oper =Console.ReadLine ();
// 根據運算子不同,決定怎麼計算
CalFather cf = Decise(oper,num1,num2);
double r = cf.GetResult();
Console.WriteLine("計算結果為{0}",r);
Console.ReadKey();
}
public static CalFather Decise(string oper,int num1,int num2) // static 需要引用類名使用;非static的話,需要在這裡建立program類(所在的類),再引用
{
CalFather calf=null;
switch(oper){
case "+":
calf = new PlusCal(num1,num2);
break;
case "-":
calf = new MinuCal(num1,num2);
break;
case "*":
calf = new MultiCal(num1,num2);
break;
case "/":
calf = new DivCal(num1,num2);
break;
default:
Console.WriteLine("請輸入正確的操作符");
break;
}
return calf;
}
}
}
2、CalFather.cs
namespace calculator
{
public abstract class CalFather
{
public int Number1
{
get;
set;
}
public int Number2
{
get;
set;
}
public CalFather(int N1, int N2)
{
this.Number1 = N1;
this.Number2 = N2;
}
public abstract double GetResult();
}
}
3、PlusCal.cs
namespace calculator
{
public class PlusCal : CalFather
{
public PlusCal(int n1, int n2)
:base(n1,n2)
{
}
public override double GetResult() //重寫父類的抽象方法
{
double res;
res = this.Number1 + this.Number2;
return res;
}
}
}
4、MinuCal.cs
namespace calculator
{
public class MinuCal:CalFather
{
public MinuCal(int m1,int m2)
:base(m1,m2){
}
public override double GetResult()
{
return this.Number1 - this.Number2;
}
}
}
5、MultiCal.cs
namespace calculator
{
public class MultiCal : CalFather
{
public MultiCal(int n1,int n2) : base(n1,n2) { }
public override double GetResult()
{
return this.Number1 * this.Number2;
}
}
}
6、DivCal.cs
namespace calculator
{
public class DivCal : CalFather
{
public DivCal(int n1,int n2) : base(n1,n2) { }
public override double GetResult()
{
return this.Number1 / this.Number2;
}
}
}