电子商务网站设计案例,做网站用的什么软件,江苏建设部网站,有效果的网站排名C# 面向对象编程
面向过程#xff1a;一件事情分成多个步骤来完成。
把大象装进冰箱 (面向过程化设计思想)。走一步看一步。
1、打开冰箱门
2、把大象放进冰箱
3、关闭冰箱门
面向对象#xff1a;以对象作为主体
把大象装进冰箱
1、抽取对象 大象 冰箱 门 #xff0…C# 面向对象编程
面向过程一件事情分成多个步骤来完成。
把大象装进冰箱 (面向过程化设计思想)。走一步看一步。
1、打开冰箱门
2、把大象放进冰箱
3、关闭冰箱门
面向对象以对象作为主体
把大象装进冰箱
1、抽取对象 大象 冰箱 门 全局规划。
2、找有没有工具可以帮助我来完成这个操作 找对象帮自己完成任务
3、组织工具执行合理逻辑。
4、大象
5、冰箱 装东西
6、门 开门和关门 OOP 定义
面向对象编程OOP是一种使用对象及其相互作用设计应用和计算机程序的编程范例。
OOP 中有一些基本的编程概念
抽象化 (抽象化也在我们编程世界中 所有类都是抽象化物以类聚拥有共同的特性或者行为
椅子类 人类 动物类 【本质就是归类】 多态性 【一类多种表现形态】【本质就是抽象化的程度】 封装形式 【抽像后的共同行为的封装【吹冷风】】就是隐藏对象行为实现的细节。
出冷风(); // 需要不需要管方法内部实现逻辑。【对接三方支付一样】
继承【抽象过程儿子(子类)可以继承父亲(父类)的共有财产】
抽象通过建模适合该问题的类来简化复杂的现实。 多态性是将运算符或函数以不同方式用于不同数据输入的过程。 封装对其他对象隐藏了类的实现细节。 继承是一种使用已经定义的类形成新类的方法。 现实生活中
对象就是实实在在的具体事物。
类现实生活中多个事物共同特征和行为归类
eg 手机
苹果 三星 华为 OPPO……
共同特征 颜色 尺寸 分辨率 我们内存 电池容量。。。。。。
共同行为发短信 刷视频 打电话 打语音 开视频。。。。。。 编程中
类
手机类
// 现实中的类的特性被抽象为类的成员变量
颜色
尺寸
分辨率
内存大小
电池容量// 现实生活中的行为或者功能抽象为类的方法
发短信方法();
打电话方法();
开视频方法();
........... 编程世界中类来源于真实世界中一类事物共同特性和行为抽象。【类是对象模板】 对象
// 创建一个手机对象
手机类 phone new 手机类();
phone.颜色红色;
phone.尺寸61.7寸;
phone.分辨率2048X1096 对象其实是类的实例【对象是类实例】 C# 对象
对象是 C# OOP 程序的基本构建块。 对象是数据和方法的组合。 数据和方法称为对象的成员。 在 OOP 程序中我们创建对象。 这些对象通过方法进行通信。 每个对象都可以接收消息发送消息和处理数据。
创建对象有两个步骤。 首先我们定义一个类。 类是对象的模板。 它是一个蓝图描述了类对象共享的状态和行为。 一个类可以用来创建许多对象。 在运行时从类创建的对象称为该特定类的实例。
Program.
using System;namespace Being
{class Being {}class Program{static void Main(string[] args){var b new Being();Console.WriteLine(b);}}
}
在第一个示例中我们创建一个简单的对象。
class Being {}这是一个简单的类定义。 模板的主体为空。 它没有任何数据或方法。
var b new Being();我们创建Being类的新实例。 为此我们使用了new关键字。 b变量是创建对象的句柄。
Console.WriteLine(b);我们将对象打印到控制台以获取该对象的一些基本描述。 打印对象是什么意思 实际上当我们打印对象时我们将其称为ToString()方法。 但是我们还没有定义任何方法。 这是因为创建的每个对象都继承自基本object。 它具有一些基本功能可以在所有创建的对象之间共享。 其中之一是ToString()方法。
$ dotnet run
Being.Being
我们得到对象类名。
C# 对象属性
对象属性是捆绑在类实例中的数据。 对象属性称为实例变量或成员字段。 实例变量是在类中定义的变量该类中的每个对象都有一个单独的副本。 Program.
using System;namespace ObjectAttributes
{class Person{//实例变量,这个变量必须通过类实例化后才能操作public string name;}class Program{static void Main(string[] args){var p1 new Person();p1.name Jane;var p2 new Person();p2.name Beky;Console.WriteLine(p1.name);Console.WriteLine(p2.name);}}
}
在上面的 C# 代码中我们有一个带有一个成员字段的Person类。
class Person
{public string name;
}
我们声明一个名称成员字段。 public关键字指定可以在类块之外访问成员字段。
var p1 new Person();
p1.name Jane;
我们创建Person类的实例并将名称变量设置为“ Jane”。 我们使用点运算符来访问对象的属性。
var p2 new Person();
p2.name Beky;
我们创建Person类的另一个实例。 在这里我们将变量设置为“ Beky”。
Console.WriteLine(p1.name);
Console.WriteLine(p2.name);
我们将变量的内容打印到控制台。
$ dotnet run
Jane
Beky
我们看到了程序的输出。 Person类的每个实例都有一个单独的名称成员字段副本。
C# 方法
方法是在类主体内定义的函数。 它们用于通过对象的属性执行操作。 方法将模块化带入我们的程序。
在 OOP 范式的封装概念中方法至关重要。 例如我们的AccessDatabase类中可能有一个Connect()方法。 我们无需知道方法Connect()如何精确地连接到数据库。 我们只需要知道它用于连接数据库。 这对于划分编程中的职责至关重要尤其是在大型应用中。
对象将状态/特性和行为分组方法代表对象的行为部分。
Program.
using System;namespace Methods
{class Circle{private int radius;public void SetRadius(int radius){this.radius radius;}public double Area(){return this.radius * this.radius * Math.PI;}}class Program{static void Main(string[] args){var c new Circle();c.SetRadius(5);Console.WriteLine(c.Area());}}
}
在代码示例中我们有一个 Circle 类。 我们定义了两种方法。
private int radius;我们只有一个成员字段。 它是圆的半径。 private关键字是访问说明符。 它表明变量仅限于外部世界。 如果要从外部修改此变量则必须使用公共可用的SetRadius()方法。 这样我们可以保护我们的数据。
public void SetRadius(int radius)
{this.radius radius;
}
这是SetRadius()方法。 this变量是一个特殊变量我们用它来访问方法中的成员字段。 this.radius是实例变量而半径是局部变量仅在SetRadius()方法内部有效。
var c new Circle();
c.SetRadius(5);
我们创建Circle类的实例并通过在圆对象上调用SetRadius()方法来设置其半径。 我们使用点运算符来调用该方法。
public double Area()
{return this.radius * this.radius * Math.PI;
}
Area()方法返回圆的面积。 Math.PI是内置常数。
$ dotnet run
78.5398163397448
运行该示例可得出此结果。
C# 访问修饰符
访问修饰符设置方法和成员字段的可见性。 C# 具有四个基本访问修饰符publicprotectedprivate和internal。 可以从任何地方访问public成员。 protected成员只能在类本身内部以及继承的和父类访问。 private成员仅限于包含类型例如 仅在其类或接口内。 可以从同一程序集exe 或 DLL中访问internal成员。
修饰符还有两种组合protected internal和private protected。 protected internal类型或成员可以由声明它的程序集中的任何代码访问也可以从另一个程序集中的派生类中访问。 private protected类型或成员只能在其声明程序集中通过同一个类或从该类派生的类型的代码进行访问。
访问修饰符可防止意外修改数据。 它们使程序更强大。
类当前程序集派生类当前程序集中的派生类整个程序publicprotectedoointernaloooprivateooooprotected internaloprivate protectedooo
上表总结了 C# 访问修饰符是可访问的o 是不可访问的。
Program.
using System;namespace AccessModifiers
{class Person{public string name;private int age;public int GetAge(){return this.age;}public void SetAge(int age){this.age age;}}class Program{static void Main(string[] args){var p new Person();p.name Jane;p.SetAge(17);Console.WriteLine({0} is {1} years old,p.name, p.GetAge());}}
}
在上面的程序中我们有两个成员字段。 一个被宣布为公开另一个被宣布为私有。
public int GetAge()
{return this.age;
}
如果成员字段是private则访问它的唯一方法是通过方法。 如果要在类外部修改属性则必须将方法声明为public。 这是数据保护的重要方面。
public void SetAge(int age)
{this.age age;
}
SetAge()方法使我们能够从类定义之外更改private年龄变量。
var p new Person();
p.name Jane;
我们创建Person类的新实例。 因为名称属性是public所以我们可以直接访问它。 但是不建议这样做。
p.SetAge(17);SetAge()方法修改年龄成员字段。 由于已声明private因此无法直接访问或修改。
Console.WriteLine({0} is {1} years old,p.name, p.GetAge());
最后我们访问两个成员以构建一个字符串。
$ dotnet run
Jane is 17 years old
运行示例将给出此输出。
具有private访问修饰符的成员字段不被派生类继承。
Program.
using System;namespace Protected
{class Base{public string name Base;protected int id 5323;private bool isDefined true;}class Derived : Base{public void info(){Console.WriteLine(This is Derived class);Console.WriteLine(Members inherited);Console.WriteLine(this.name);Console.WriteLine(this.id);// Console.WriteLine(this.isDefined);}}class Program{static void Main(string[] args){var derived new Derived();derived.info();}}
}
在前面的程序中我们有一个Derived类该类继承自Base类。 Base类具有三个成员字段。 全部具有不同的访问修饰符。 isDefined 成员不继承。 private修饰符可以防止这种情况。
class Derived : Base类Derived继承自Base类。 要从另一个类继承我们使用冒号:)运算符。
Console.WriteLine(this.name);
Console.WriteLine(this.id);
// Console.WriteLine(this.isDefined);
public和protected成员由Derived类继承。 可以访问它们。 private成员未继承。 访问成员字段的行被注释。 如果我们取消注释该行则代码将无法编译。
$ dotnet run
Program.(9,22): warning 0414: The field Base.isDefined is assigned but its value
is never used [C:\Users\Jano\Documents\harp\tutorial\oop\Protected\Protected.proj]
This is Derived class
Members inherited
Base
5323
运行程序我们收到此输出。
C# 构造函数 (初始化成员变量的角色)
构造函数是一种特殊的方法。 创建对象时会自动调用它。 构造函数不返回值。 构造函数的目的是初始化对象的状态。 构造函数与类具有相同的名称。 构造函数是方法因此它们也可以重载。
构造函数不能被继承。 它们按继承顺序被调用。 如果我们不为类编写任何构造函数则 C# 提供一个隐式默认构造函数。 如果提供任何类型的构造函数则不提供默认值。
Program.
using System;namespace Constructor
{class Being{public Being(){Console.WriteLine(Being is created);}public Being(string being){Console.WriteLine(Being {0} is created, being);}}class Program{static void Main(string[] args){new Being();new Being(Tom);}}
}
我们有一个Being类。 此类具有两个构造函数。 第一个不带参数 第二个采用一个参数。
public Being(string being)
{Console.WriteLine(Being {0} is created, being);
}
此构造函数采用一个字符串参数。
new Being();创建Being类的实例。 这次在创建对象时调用没有参数的构造函数。
$ dotnet run
Being is created
Being Tom is created
这是程序的输出。
在下一个示例中我们初始化类的数据成员。 变量的初始化是构造函数的典型工作。
Program.
using System;namespace Constructor2
{class MyFriend{private DateTime born;private string name;public MyFriend(string name, DateTime born){this.name name;this.born born;}public void Info(){Console.WriteLine({0} was born on {1},this.name, this.born.ToShortDateString());}}class Program{static void Main(string[] args){var name Lenka;var born new DateTime(1990, 3, 5);var friend new MyFriend(name, born);friend.Info();}}
}
我们有一个带有数据成员和方法的MyFriend类。
private DateTime born;
private string name;
类定义中有两个私有变量。
public MyFriend(string name, DateTime born)
{this.name name;this.born born;
}
在构造函数中我们启动两个数据成员。 this变量是用于引用对象变量的处理程序。
var friend new MyFriend(name, born);
friend.Info();
我们创建带有两个参数的MyFriend对象。 然后我们调用对象的Info()方法。
$ dotnet run
Lenka was born on 3/5/1990
这是输出。
C# 构造函数链接
构造函数链接是类从构造函数调用另一个构造函数的能力。 要从同一类调用另一个构造函数我们使用this关键字。
Program.
using System;namespace ConstructorChaining
{class Circle{public Circle(int radius){Console.WriteLine(Circle, r{0} is created, radius);}public Circle() : this(1){}}class Program{static void Main(string[] args){new Circle(5);new Circle();}}
}
我们有一个Circle类。 该类具有两个构造函数。 一种采用一个参数一种不采用任何参数。
public Circle(int radius)
{Console.WriteLine(Circle, r{0} is created, radius);
}
此构造函数采用一个参数-radius。
public Circle() : this(1)
{}
这是没有参数的构造函数。 它只是简单地调用另一个构造函数并为其提供默认半径 1。
$ dotnet run
Circle, r5 is created
Circle, r1 is created
C# ToString方法
每个对象都有一个ToString()方法。 它返回人类可读的对象表示形式。 默认实现返回Object类型的标准名称。 请注意当我们使用对象作为参数调用Console.WriteLine()方法时将调用ToString()。
Program.
using System;namespace ToStringMethod
{class Being{public override string ToString(){return This is Being class;}}class Program{static void Main(string[] args){var b new Being();var o new Object();Console.WriteLine(o.ToString());Console.WriteLine(b.ToString());Console.WriteLine(b);}}
}
我们有一个Being类其中我们重写了ToString()方法的默认实现。
public override string ToString()
{return This is Being class;
}
创建的每个类都从基object继承。 ToString()方法属于此对象类。 我们使用override关键字来通知我们正在覆盖方法。
var b new Being();
var o new Object();
我们创建一个自定义对象和一个内置对象。
Console.WriteLine(o.ToString());
Console.WriteLine(b.ToString());
我们在这两个对象上调用ToString()方法。
Console.WriteLine(b);正如我们之前指定的将对象作为Console.WriteLine()的参数将调用其ToString()方法。 这次我们隐式调用了该方法。
$ dotnet run
System.Object
This is Being class
This is Being class
这是我们运行示例时得到的。
C# 对象初始化器
对象初始化程序让我们在创建时将值分配给对象的任何可访问字段或属性而无需调用构造函数。 属性或字段在{}括号内分配。 另外我们可以为构造函数指定参数也可以省略参数。
Program.
using System;namespace ObjectInitializers
{class User{public User() {}public string Name { set; get; }public string Occupation { set; get; }public override string ToString(){return ${Name} is a {Occupation};}}class Program{static void Main(string[] args){var u new User { Name John Doe, Occupation gardener };Console.WriteLine(u);}}
}
在示例中我们使用对象初始化程序语法创建一个新用户。
public User() {}我们定义一个空的构造函数。
public string Name { set; get; }
public string Occupation { set; get; }
我们有两个属性Name和Occupation。
var u new User { Name John Doe, Occupation gardener };我们将值分配给{}括号中的属性。
$ dotnet run
John Doe is a gardener
C# 类常量
C# 可以创建类常量。 这些常量不属于具体对象。 他们属于阶级。 按照约定常量用大写字母表示。
Program.
using System;namespace ClassConstants
{class Math{public const double PI 3.14159265359;}class Program{static void Main(string[] args){Console.WriteLine(Math.PI);}}
}
我们有一个带有PI常量的Math类。
public const double PI 3.14159265359;const关键字用于定义常数。 public关键字使它可以在类的主体之外访问。
$ dotnet run
3.14159265359
运行示例我们看到此输出。
C# 继承
继承是使用已经定义的类形成新类的方法。 新形成的类称为派生的类我们派生的类称为基类。 继承的重要好处是代码重用和降低程序的复杂性。 派生类后代将覆盖或扩展基类祖先的功能。
Program.
using System;namespace Inheritance
{class Being{public Being(){Console.WriteLine(Being is created);}}class Human : Being{public Human(){Console.WriteLine(Human is created);}}class Program{static void Main(string[] args){new Human();}}
}
在此程序中我们有两个类。 基类Being和派生的Human类。 派生类继承自基类。
class Human : Being在 C# 中我们使用冒号:)运算符创建继承关系。
new Human();我们实例化派生的Human类。
$ dotnet run
Being is created
Human is created
我们可以看到两个构造函数都被调用了。 首先调用基类的构造函数然后调用派生类的构造函数。
接下来是一个更复杂的示例。
Program.
using System;namespace Inheritance2
{class Being{static int count 0;public Being(){count;Console.WriteLine(Being is created);}public void GetCount(){Console.WriteLine(There are {0} Beings, count);}}class Human : Being{public Human(){Console.WriteLine(Human is created);}}class Animal : Being{public Animal(){Console.WriteLine(Animal is created);}}class Dog : Animal{public Dog(){Console.WriteLine(Dog is created);}}class Program{static void Main(string[] args){new Human();var dog new Dog();dog.GetCount();}}
}
我们有四个班。 继承层次更加复杂。 Human和Animal类继承自Being类。 Dog 类直接继承自Animal类并间接继承自Being类。 我们还介绍了static变量的概念。
static int count 0;我们定义一个static变量。 静态成员是类的所有实例共享的成员。
Being()
{count;Console.WriteLine(Being is created);
}
每次实例化Being类时我们将 count 变量增加一。 这样我们就可以跟踪创建的实例数。
class Animal : Being
...class Dog : Animal
...
Animal继承自BeingDog继承自Animal。 Dog也间接继承自Being。
new Human();
var dog new Dog();
dog.GetCount();
我们从Human和Dog类创建实例。 我们称为 Dog 对象的GetCount()方法。
$ dotnet run
Being is created
Human is created
Being is created
Animal is created
Dog is created
There are 2 Beings
Human调用两个构造函数。 Dog调用三个构造函数。 有两个实例化的存在。
我们使用base关键字显式调用父级的构造函数。
Program.
using System;namespace Shapes
{class Shape{protected int x;protected int y;public Shape(){Console.WriteLine(Shape is created);}public Shape(int x, int y){this.x x;this.y y;}}class Circle : Shape{private int r;public Circle(int r, int x, int y) : base(x, y){this.r r;}public override string ToString(){return String.Format(Circle, r:{0}, x:{1}, y:{2}, r, x, y);}}class Program{static void Main(string[] args){var c new Circle(2, 5, 6);Console.WriteLine(c);}}
}
我们有两个类Shape类和Circle类。 Shape类是几何形状的基类。 我们可以在此类中加入一些常见形状的共同点例如x和y坐标。
public Shape()
{Console.WriteLine(Shape is created);
}public Shape(int x, int y)
{this.x x;this.y y;
}
Shape类具有两个构造函数。 第一个是默认构造函数。 第二个参数有两个参数xy 坐标。
public Circle(int r, int x, int y) : base(x, y)
{this.r r;
}
这是Circle类的构造函数。 此构造函数启动r成员并调用父级的第二个构造函数并向其传递x和y坐标。 如果不使用base关键字显式调用构造函数则将调用Shape类的默认构造函数。
$ dotnet run
Circle, r:2, x:5, y:6
这是示例的输出。
C# 抽象类和方法
抽象类无法实例化。 如果一个类至少包含一个抽象方法则也必须将其声明为抽象方法。 抽象方法无法实现 他们只是声明方法的签名。 当我们从抽象类继承时所有抽象方法都必须由派生类实现。 此外必须以较少受限制的可见性声明这些方法。
与接口不同抽象类可能具有完全实现的方法并且可能具有定义的成员字段。 因此抽象类可以提供部分实现。 程序员经常将一些通用功能放入抽象类中。 这些抽象类随后会被子类化以提供更具体的实现。 例如Qt 图形库具有QAbstractButton它是按钮小部件的抽象基类提供按钮所共有的功能。 按钮Q3ButtonQCheckBoxQPushButtonQRadioButton和QToolButton都从此基本抽象类继承。
正式地说抽象类用于强制执行协议。 协议是所有实现对象都必须支持的一组操作。
Program.
using System;namespace AbstractClass
{abstract class Drawing{protected int x 0;protected int y 0;public abstract double Area();public string GetCoordinates(){return string.Format(x: {0}, y: {1}, this.x, this.y);}}class Circle : Drawing{private int r;public Circle(int x, int y, int r){this.x x;this.y y;this.r r;}public override double Area(){return this.r * this.r * Math.PI;}public override string ToString(){return string.Format(Circle at x: {0}, y: {1}, radius: {2},this.x, this.y, this.r);}}class Program{static void Main(string[] args){var c new Circle(12, 45, 22);Console.WriteLine(c);Console.WriteLine(Area of circle: {0}, c.Area());Console.WriteLine(c.GetCoordinates());}}
}
我们有一个抽象基类Drawing。 该类定义两个成员字段定义一个方法并声明一个方法。 一种方法是抽象的另一种是完全实现的。 Drawing类是抽象的因为我们无法绘制它。 我们可以画一个圆一个点或一个正方形。 Drawing类对我们可以绘制的对象具有一些通用功能。
abstract class Drawing我们使用abstract关键字定义一个抽象类。
public abstract double Area();抽象方法之前还带有abstract关键字。
class Circle : Drawing圆是Drawing类的子类。 它必须实现抽象的Area()方法。
public override double Area()
{return this.r * this.r * Math.PI;
}
当我们实现Area()方法时必须使用override关键字。 这样我们通知编译器我们将覆盖现有的继承的方法。
$ dotnet run
Circle at x: 12, y: 45, radius: 22
Area of circle: 1520.53084433746
x: 12, y: 45
C# 部分类
使用partial关键字可以将类的定义拆分到同一名称空间中的几个部分中。 该类也可以在多个文件中定义。
当使用非常大的代码库时可以使用部分类这些代码库可以拆分为较小的单元。 局部类也与自动代码生成器一起使用。
Program.
using System;namespace PartialClass
{partial class Worker{public string DoWork(){return Doing work;}}partial class Worker{public string DoPause(){return Pausing;}}class Program{static void Main(string[] args){var worker new Worker();Console.WriteLine(worker.DoWork());Console.WriteLine(worker.DoWork());Console.WriteLine(worker.DoPause());}}
}
在示例中我们将Worker类定义为两部分。 这些部分由编译器连接在一起以形成最终类。
$ dotnet run
Doing work
Doing work
Pausing