C#随记05

方法

方法在类或结构中声明,声明时需要指定访问级别,返回值,方法名称及方法参数,方法参数放在括号中,并用逗号隔开。括号中没有内容表示声明的方法没有参数。

修饰符 返回值类型 方法名(参数列表){
//方法的具体实现
}

如果方法不需要返回一个值,则使用void关键字。
方法的定义必须在某个类中,定义方法时如果没有声明访问修饰符,方法的默认访问权限为private
如果定义的方法有返回值,则必须使用renturn关键字返回一个指定类型的数据。

public int ShowGoods(){
	Console.writeLine("商品信息");
	return 1;
}

方法的参数

传给方法的值叫实参
接收实参的变量叫形参
形参只在方法内部有效。

  • 值参数
    值参数就是在声明时不加修饰符的参数。它表明实参与形参之间按值传递。
  • ref参数
    ref参数使用形参按引用传递(即使形参是值类型),其效果是:在方法中对形参所做的任何更改都将反应在实参中。如果要使用ref参数,则方法声明和调用都必须显示使用ref关键字。
    变量必须在传递之前赋值。
  • out参数
    定义输出参数,会导致参数通过引用来传递、
  • params参数
    声明方法时,如果有多个相同类型的参数,可以定义为params参数,params参数是一个一维数组,主要用来指定在参数数目可变时所采用的方法参数。

方法的重载

方法重载是指方法名相同,但参数的数据类型,个数,顺序不同的方法。

类的静态成员

共享的变量或者方法用static修饰,它们被称作静态变量和静态方法,也被称为类的静态成员,静态成员是属于类所有的,在调用时,不用创建类的对象,而且直接使用类名调用。

class Program{
	public static int Add(intx, int y){
	return x+y;
	}
	static void Main(string[] args){
	Console.WriteLine("{0}+{1}={2}",23,43,Program.Add(23+34));
	Console.ReadLine();
	}
}

对象的创建及使用

在一类事物中抽象出某一个特例,通过这个特例来处理这类事物出现的问题。

Test test=new Test();

当使用new关键字创建对象后,可使用“对象.类成员”来获取对象的属性和行为。

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

namespace studyDaily
{

    public class cStockInfo
    {
        public string FullName
        {
            get;
            set;
        }
        public void ShowGoods()
        {
            Console.WriteLine("库存商品名称:");
            Console.WriteLine(FullName);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            cStockInfo stockInfo = new cStockInfo();
            stockInfo.FullName = "笔记本电脑";
            stockInfo.ShowGoods();
            Console.ReadLine();
        }
    }
}

对象的销毁

每个对象都有生命周期,当对象的生命周期结束时,分配给该对象的内存地址将会被回收。
垃圾:

  • 对象引用超过其作用返回
  • 将对象赋值为null

类与对象的关系

类是具有相同或相似结构、操作和约束规则的对象组成的集合,而对象是某一类的具体化实例,每一个类都是具有某些共同特征的对象的抽象。

继承

在程序设计中实现继承,表示这个类拥有它继承的类的所有公有成员或者受保护成员。在面向对象编程中,被继承的类称为父类或基类,实现继承的类称为子类或派生类

继承的实现

派生类可以继承基类原有的属性和方法,也可以增加原来基类所不具备的属性和方法,或者直接重写基类中的某些方法。
C#使用“:”来标识两个类的继承关系,继承一个类时,类成员的可访问性是一个重要的问题。派生类不能访问基类的私有成员,但是可以访问其公共成员。
父类和派生类可以访问protected成员。

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

namespace studyDaily
{
    class Goods {
    public string TradeCode { get; set; }
        public string FullName { get; set; }
    }
    class JHInfo : Goods
    {
        public string JHID { get; set; }
        public void showInfo()
        {
            Console.WriteLine("进货编号:{0}\n商品编号:{1}\n商品名称:{2}", JHID, TradeCode, FullName);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            JHInfo jh = new JHInfo();
            jh.TradeCode = "T100001";
            jh.FullName = "笔记本电脑";
                jh.JHID = "JH0001";
            jh.showInfo();
            Console.ReadLine();
        }
    }
}

只支持单继承,不支持多重继承

base关键字

this关键字代表本类对象,base关键字代表父类对象。

base.property;//调用父类的属性
base.method();//调用父类的方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace studyDaily
{
   class Computer //父类
    {
        public string sayHello()
        {
            return "欢迎使用!";
        }
    }
    class Pad:Computer //子类:平板电脑
    {
        public new string sayHello()
        {
            //子类重写父类方法
            return base.sayHello() + "平板电脑";
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Computer pc = new Computer();
            Console.WriteLine(pc.sayHello());
            Pad ipad = new Pad();
            Console.WriteLine(ipad.sayHello());
            Console.ReadLine();
        }
    }
}

访问父类成员只能在构造函数、实例方法、实例属性中进行。不能在静态方法中使用base

多态

类的多态性是通过在派生类中重写基类的虚方法来实现的。
方法在默认情况下不是虚拟的,但(除了构造函数以外)可以显式地声明为virtual,在方法前面加上关键字virtual,则成该方法为虚方法。

public virtual void Move(){
 Console.WriteLine("交通工具都可以移动");
}

定义为虚方法后,可以在派生类中重写虚方法,重写虚方法使用override关键字

public override void Move(){
	Console.WriteLine("火车都可以移动");
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace studyDaily
{
    class Vehicle
    {
        string name;
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }
        public virtual void Move() {
            Console.WriteLine("{0}都可移动", Name);
        }
    }

    class Train : Vehicle
    {
        public override void Move()
        {
            Console.WriteLine("{0}在公路上行驶", Name);
        }
    }
    class Car: Vehicle
    {
        public override void Move()
        {
            Console.WriteLine("{0}在公路上行驶", Name);
        }
    }
    class Program{
        static void Main(string[] args)
        {
            Vehicle vehicle = new Vehicle();
            Train train = new Train();
            Car car = new Car();
            Vehicle[] vehicles = { vehicle, train, car };
            vehicle.Name = "交通工具";
            train.Name = "火车";
            car.Name = "汽车";
            vehicles[0].Move();
            vehicles[1].Move();
            vehicles[2].Move();
            Console.ReadLine();
        }
    } }

抽象类与抽象方法

如果一个类不与具体的事物相联系,而只是表达一种抽象的概念或行为,仅仅是作为其派生类的一个基类,这样的类就可以声明为抽象类。
去商场买衣服。

  • 声明抽象类时需要使用abstract关键字
访问修饰符 abstract class 类名:基类或接口{
类成员
}

抽象类主要用来提供多个派生类可共享的基类的公共定义,它与非抽象类的主要区别如下:

  • 抽象类不能直接实例化
  • 抽象类中可以包含抽象成员,但非抽象类中不可以
  • 抽象类不能被密封
    声明抽象方法:
  • 抽象方法必须声明在抽象类中
  • 声明抽象方法时,不能使用virtual、static、private修饰符
public abstract class TestClass{
public abstract void AbsMethod();
}

类中只要有一个方法声明为抽象方法,这个类必须被声明为抽象类
当从抽象类派生一个非抽象类时,需要在非抽象类中重写抽象方法,以提供具体实现,在重写抽象方法时需要使用override关键字。

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

namespace studyDaily
{
    public abstract class Market
    {
        public string Name { get; set; }
        public string Goods { get; set; }
        public abstract void Shop();
    }
    public class WallMarket : Market
    {
        public override void Shop()
        {
            Console.WriteLine(Name + "购买" + Goods);
        }
    }
    public class TaobaoMarket : Market
    {
        public override void Shop()
        {
            Console.WriteLine(Name + "购买" + Goods);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Market market = new WallMarket();
            market.Name = "沃尔玛";
            market.Goods= "苹果";
            market.Shop();
            market = new TaobaoMarket();
            market.Name = "淘宝";
            market.Goods = "耳环";
            market.Shop();
            Console.ReadLine();
        }
    }
}

接口的使用

C#不支持多重继承
可通过接口实现多重继承的功能
接口提出了一种规范,强制性要求派生类必须实现接口约定的规范,以保证派生类必须拥有某些特性

修饰符 interface 接口名称:继承的接口列表{
接口内容
}
  • 接口类似于抽象基类:继承接口的任何类型都必须实现接口的所有成员
  • 接口中不能包括构造函数,因此不能直接实例化接口
  • 接口可以包含属性、方法、索引器和事件
  • 接口只能定义成员不能实现成员
  • 接口定义的成员不允许加访问修饰符,因为接口成员永远是公共的
  • 接口中的成员不能声明为虚拟或者静态
interface Information{
	string Code{get;set;}
	string Name{get;set;}
	void showInfo();
}

接口的实现通过继承来实现,一个类虽然只能继承一个基类,但可以继承任意多个接口。声明实现接口的类时,需要在继承列表中包含所实现的接口的名称,多个接口之间用逗号分隔。

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

namespace studyDaily
{
interface IPerson
    {
        string Name { get; set; }
        int Age { get; set; }
        void Speek();
        void Work();
    }
    class Student:IPerson
    {
        public string Name { get; set; }
        private int age;
        public int Age
        {
            get
            {
                return age;
            }
            set
            {
                if (age > 0 && age < 120)
                {
                    age = value;
                }
            }
        }
        public void Speek()
        {
            Console.WriteLine(Name+"老师好!");
        }
        public void Work()
        {
            Console.WriteLine(Name + "同学们开始记笔记");
        }
    }
    class Teacher : IPerson
    {
        public string Name { get; set; }
        private int age;
        public int Age
        {
            get
            {
                return age;
            }
            set
            {
                if (age > 0 && age < 120)
                {
                    age = value;
                }
            }
        }
        public void Speek()
        {
            Console.WriteLine(Name + "同学们好!");
        }
        public void Work()
        {
            Console.WriteLine(Name + "同学们开始记笔记");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            IPerson[] person = new IPerson[] { new Student(), new Teacher() };
            person[0].Name = "小明";
            person[0].Age = 12;
            person[1].Name = "小红";
            person[1].Age= 32;
            person[0].Speek();
            person[1].Speek();
            Console.WriteLine();
            person[0].Work();
            person[1].Work();
            Console.WriteLine();
            Console.ReadLine();
        }
    }
}
posted @ 2023-03-08 21:46  flyall  阅读(33)  评论(0)    收藏  举报