C# 中类与继承等概念
C#是一种现代的、面向对象的编程语言,其中类和继承是面向对象编程语言中非常重要的概念,类和继承是C#中面向对象编程的基本概念,可以用于创建复杂的应用程序和模块,而多态和接口可以使程序更加灵活和可扩展。 熟练掌握这些概念有助于提高C#编程效率和质量。
下面简要介绍:
类(Class):
类是C#中面向对象编程的基本单位,它是一种用户自定义的数据类型,可以封装数据和方法。类定义了一个对象的属性和方法,并且可以创建其多个实例。一个类可以有自己的构造函数、方法、属性和字段等。
继承(Inheritance):
继承是一种面向对象编程的概念,允许创建一个新类(子类),它从现有的一个或多个类(父类)继承属性和方法,从而可以重用现有代码。子类可以添加新的属性和方法,或覆盖父类的方法。
多态(Polymorphism):
多态是一种面向对象编程的概念,它允许同一个方法名可以在不同的对象上执行不同的操作。多态使程序编写更加灵活,可以适应不同的使用场景。
接口(Interface):
接口定义了一组方法或属性的规范,而不提供实现。接口只定义了方法或属性的名称,而不定义它们的实现方式。类可以实现(implement)一个或多个接口,从而提供了它们的具体实现。
构造函数/析构函数:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Person
{
public int Number;
public string Name;
private int tmp = 0;
// 定义构造函数
public Person(int x,string y)
{
this.Number = x;
this.Name = y;
Console.WriteLine("构造函数执行");
}
// 定义析构函数
~Person()
{
Console.WriteLine("析构函数执行");
}
}
class Program
{
static void Main(string[] args)
{
Person ptr = new Person(1001, "lyshark");
Console.WriteLine("ID: {0} Name: {1}", ptr.Number, ptr.Name);
Console.ReadKey();
}
}
}
对象中Get/Set方法: 该方法是用来限定用户属性的。
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Person
{
private int _age;
public int age
{
// 当用户输出该属性的值是执行Get方法
get { return _age; }
// 当用户对该属性赋值时执行Set方法
set
{
// 判断如果年龄小于0或者大于100则直接返回0
if (value < 0 || value > 100)
{
value = 0;
}
// 否则将用户数据赋值给变量
_age = value;
}
}
// 定义构造函数
public Person(int x)
{
this.age = x;
}
}
class Program
{
static void Main(string[] args)
{
Person ptr = new Person(10);
Console.WriteLine("正常年龄: {0}", ptr.age);
Person ptr_err = new Person(102);
Console.WriteLine("异常年龄: {0}", ptr_err.age);
Console.ReadKey();
}
}
}
静态方法与非静态方法:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Person
{
private static string _name;
public static string Name
{
get { return Person._name; }
set { Person._name = value; }
}
private char _gender;
public char Gender
{
get { return _gender; }
set { _gender = value; }
}
public void M1()
{
Console.WriteLine("我是非静态的方法");
}
public static void M2()
{
Console.WriteLine("我是一个静态方法");
}
}
class Program
{
static void Main(string[] args)
{
Person ptr = new Person();
// 调用非静态方法
ptr.M1();
// 调用静态方法
Person.M2();
Console.ReadKey();
}
}
}
继承的基本使用:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
// 定义基类
public class Person
{
public string name;
public int age;
public Person(string _name, int _age)
{
this.name = _name;
this.age = _age;
}
public void Display()
{
Console.WriteLine("姓名: {0} 年龄:{1} ", this.name, this.age);
}
}
// 定义派生类
public class Studnet: Person
{
public int stu;
public Studnet(string _name,int _age,int _stu):base(_name,_age)
{
this.stu = _stu;
}
public void Display()
{
Console.WriteLine("Stu编号: {0} 学生姓名: {1} 年龄: {2}",this.stu,this.name,this.age);
}
}
class Program
{
static void Main(string[] args)
{
// 定义基类
Person ptr = new Person("lyshark",22);
ptr.Display();
// 定义派生类
Studnet stu = new Studnet("lyshark",22,1001);
stu.Display();
Console.ReadKey();
}
}
}
虚方法实现多态: 首先将父类函数标记为虚方法,然后子类就可以重写父类的虚方法,实现多态。
using System;
using System.Collections;
namespace ConsoleApplication1
{
// 定义一个人类的基类
public class Person
{
public string name;
public Person(string name)
{
this.name = name;
}
public virtual void SayHello()
{
Console.WriteLine("基类方法");
}
}
// 定义日本人并继承人类,重写SayHello方法
public class Japanese : Person
{
public Japanese(string name) : base(name) { }
// 重写父类的SayHello
public override void SayHello()
{
base.SayHello();
Console.WriteLine("日本人");
}
}
// 定义中国并继承人类,重写SayHello方法
public class Chinese : Person
{
public Chinese(string name) : base(name) { }
// 重写父类的SayHello
public override void SayHello()
{
Console.WriteLine("中国人");
}
}
class Program
{
static void Main(string[] args)
{
// 普通的调用方式
Japanese jap = new Japanese("苍井空");
jap.SayHello();
Chinese chi = new Chinese("韩梅梅");
chi.SayHello();
// 直接通过循环调用
Person[] per = { jap, chi };
for (int x = 0; x < per.Length; x++)
per[x].SayHello();
Console.ReadKey();
}
}
}
抽象类实现多态: 当父类中的方法不知道如何实现的时候,可以考虑将父类定义为抽象类,将方法定义为抽象方法。
using System;
using System.Collections;
namespace ConsoleApplication1
{
// 定义一个抽象类,等待让子类重写
public abstract class Shape
{
public abstract double GetArea();
}
// 定义子类重写抽象类
public class CirCle:Shape
{
public double x;
public double y;
public CirCle(double x,double y)
{
this.x = x;
this.y = y;
}
public override double GetArea()
{
return this.x * this.y;
}
}
class Program
{
static void Main(string[] args)
{
// 抽象类不可实例化,只能实例化子类
Shape sp = new CirCle(12.5,20.8);
double ret = sp.GetArea();
Console.WriteLine("结果是: {0}", ret);
Console.ReadKey();
}
}
}
接口实现多态: 接口不允许有访问修饰符,方法自动设置为自动属性。
using System;
using System.Collections;
namespace ConsoleApplication1
{
// 定义一个接口,等待让子类重写
public interface Person
{
void Display();
}
// 定义派生类,继承于Person接口
public class Student:Person
{
public void Display()
{
Console.WriteLine("定义学生");
}
}
// 定义派生类
public class Teacher:Person
{
public void Display()
{
Console.WriteLine("定义老师");
}
}
class Program
{
static void Main(string[] args)
{
// 调用学生方法
Person stu = new Student();
stu.Display();
// 调用老师方法
Person tea = new Teacher();
tea.Display();
Console.ReadKey();
}
}
}
C# 中类与继承等概念的更多相关文章
- Java中类的继承深入剖析
在Java开发中,我们常常用到继承这一概念,可以说继承是Java这类面向对象编程语言的基石.正是有了继承这个概念,使得我们可以创建分等级层次的类.今天小编就和大家一起来深入聊聊Java语言的继承. 在 ...
- 《挑战30天C++入门极限》图例实解:C++中类的继承特性
图例实解:C++中类的继承特性 整个c++程序设计全面围绕面向对象的方式进行,类的继承特性是c++的一个非常非常重要的机制,继承特性可以使一个新类获得其父类的操作和数据结构,程序员只需在新类中 ...
- python中类的继承
python中类的继承 在python中面向对象编程中实现继承,以下面一个实例进行说明. class SchoolMenber(): # __init__类似于c++中的构造函数 # __init__ ...
- Java中类的继承,属性和方法的四种修饰符的作用范围,final关键字,java的三大特点中的2个:封装和多态,以及多态的一个设计模式,模板方法模式(template method)
(一)Java中的继承: 关于继承,在Java中类的继承只能是单继承,不像C+++那样灵活,可以多继承,多继承的后果就是各种关系乱套,就相当于一个孩子有2个母亲一样,社会关系的复杂,不利于程序后期的开 ...
- typescript中类的继承
typescript中类的继承用到的是:extends和super 先看一下typescript中类的写法: class Demo{ //类的属性 name:string; age:number; / ...
- C++虚继承的概念[转]
C++中虚拟继承的概念 为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类.这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数 ...
- C++虚继承的概念(转)
http://blog.csdn.net/wangxingbao4227/article/details/6772579 C++中虚拟继承的概念 为了解决从不同途径继承来的同名的数据成员在内存中有不同 ...
- PHP中类的继承与方法重写
php中类的继承与方法重写,欢迎大神补充指点! <?php namespace _1009; class Demo5 { //实例属性 public $product; public $pric ...
- Python中类的继承代码实例
Python中类的继承代码实例 这篇文章主要介绍了Python中类的继承代码实例,本文直接给出代码及运行效果,需要的朋友可以参考下 相对于C 的继承编写,Python更简洁,而且效率也是很高的,下面编 ...
- 第7.6节 Python中类的继承机制详述
在本章第一节,介绍了面向对象程序设计的三个特征:封装.继承和多态,前面章节重点介绍了封装和多态,由于Python语言是多态语言,对象的类型不再由继承等方式决定,而由实际运行时所表现出的具体行为来决定, ...
随机推荐
- ME5A报表增强
一.ME5A报表新增长文本字段 结构中添加字段 在该方法下添加对应的取值逻辑 二.ME5A点击科目分配按钮界面添加字段 结构中添加字段 对应位置写取值逻辑 定期更文,欢迎关注 TRANSLATE wi ...
- Woodpecker CI 设计分析|一个 Go 编写的开源持续集成引擎
一.前言 大家好,这里是白泽.随着 Go 语言在云原生领域大放异彩,开发者逐渐将目光转移到了这门语言上,而容器则是云原生时代最核心的载体. <Woodpecker CI 设计分析>系列文章 ...
- 工作中使用Redis的10种场景
前言 Redis作为一种优秀的基于key/value的缓存,有非常不错的性能和稳定性,无论是在工作中,还是面试中,都经常会出现. 今天这篇文章就跟大家一起聊聊,我在实际工作中使用Redis的10种场景 ...
- 一文读懂 Serverless 的起源、发展和落地实践
讲师 | 洛浩(阿里云云原生高级架构师) Serverless 的发展轨迹 **2012 年,Serverless 这个单词第一次出现,由 Iron 公司提出,字面意思就是不需要服务器.但是真正被 ...
- vue tabBar导航栏设计实现3-进一步抽取tab-item
系列导航 一.vue tabBar导航栏设计实现1-初步设计 二.vue tabBar导航栏设计实现2-抽取tab-bar 三.vue tabBar导航栏设计实现3-进一步抽取tab-item 四.v ...
- Java面试——数据库知识点
MySQL 1.建 主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合.一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null). 超键:在关系中能唯一标识元组的属性 ...
- freeswitch号码变化方案
概述 freeswitch是一款简单易用的开源音视频软交换平台. 在生产环境中,由于各个线路的号码规则并不统一,经常需要针对中继线路做号码变换的方案. 本文主要介绍fs中有哪些可选的号码变换方案. 环 ...
- 如何使用photoshop修改图片的像素大小(分辨率)
查看原始图片的分辨率如下:640*399
- 机器学习-无监督机器学习-kmeans衍生的算法-18
目录 1. k-Medoids 2. 二分KMEANS 3. KMeans++ 4. elkan KMeans 5. min batch KMeans算法 6.小结: 1. k-Medoids 之前的 ...
- apache mina
本文为博主原创,未经允许不得转载: Apache Mina(Apache Multipurpose Infrastructure for Network Applications)是一个基于Java的 ...