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语言是多态语言,对象的类型不再由继承等方式决定,而由实际运行时所表现出的具体行为来决定, ...
随机推荐
- RPC 框架性能测试,注意这 8 点就够了
某天,二狗子写了一个 RPC 框架后,简单测了一下性能,发现超出 grpc 一大截.二狗子一高兴,忍不住找同事吹了一波.结果,同事亲测后对二狗子说框架性能也就这样.二狗子表示不服,跟同事一番唇枪舌剑后 ...
- 为什么加了@Transactional注解,事务没有回滚?
在昨天的<事务管理入门>一文发布之后,有读者联系说根据文章尝试,加了@Transactional注解之后,事务并没有回滚.经过一顿沟通排查之后,找到了原因,在此记录一下,给后面如果碰到类似 ...
- Educational Codeforces Round 80 A - D题题解(又是卡很久的一场比赛)
第八场 CodeForces - 1288A. Deadline Example input 3 1 1 4 5 5 11 output YES YES NO Note In the first te ...
- 判断客户端是PC还是移动端问题的解决方案
今天在帮 莲的Live 2D 做浏览器适配的时候学会的一段代码 利用 Javascript 进行判断 function isPC() { //是否为PC端 var userAgentInfo = na ...
- OpenSCA技术原理之npm依赖解析
本文主要介绍基于npm包管理器的组件成分解析原理. npm 介绍 npm(全称Node Package Manager)是Node.js的预设软件包管理器. npm的依赖管理文件是package.js ...
- 写SAE评测,获 Airpods 2大奖【集结令】!
Serverless 应用引擎 SAE 开启测评有奖!名额有限,先到先得! Serverless应用引擎SAE是一款极简易用.自适应弹性的容器化应用平台.现面向所有用户发出诚挚邀请,参与一分钟部署在线 ...
- 阿里云 Serverless 异步任务处理系统在数据分析领域的应用
异步任务处理系统中的数据分析 数据处理.机器学习训练.数据统计分析是最为常见的一类离线任务.这类任务往往都是经过了一系列的预处理后,由上游统一发送到任务平台进行批量训练及分析.在处理语言方面,Pyth ...
- h5响应式方案设计
- Vue源码编译过程
Vue源码编译过程一.挂载初始化$mounted会挂载组件,不存在 render 函数时需要编译(compile);二.compile1.compile 分为 parse,optimize 和 gen ...
- 小白学标准库之 log
日常开发中,日志 log 几乎是必不可少.本文旨在介绍 log 的使用和内部实现等. 1. log 使用及实现 package main import ( "fmt" " ...