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语言是多态语言,对象的类型不再由继承等方式决定,而由实际运行时所表现出的具体行为来决定, ...
随机推荐
- springboot 整合 ehcahe后,实现缓存数据 应用关闭时序列化(磁盘持久化),重启再加载
ehcache使用很长时间了,但是却没有用到缓存数据序列化(C#中是这么个说法)与再加载.这次因为业务中需要对缓存数据进行临时存储并再加载使用,实现该功能的方式多种多样.既然ehcache有磁盘保存机 ...
- P3574 [POI2014]FAR-FarmCraft (树形DP)
这题直接贪心显然不可行. 考虑树形dp,用 \(f_i\) 表示到 \(i\) 人后,以 \(i\) 为根的所有人安装完的最短时间. 对于一个节点 \(u\), 假设拜访子节点的顺序为 \(v_1,v ...
- 【每日一题】32. 比赛 (DFS / 概率DP)
补题链接:Here [方案一:DFS] 首先我们可以计算出每道题做不出来的概率 \(unsolve[i] = (1 - a[i])(1- b[i])(1 - c[i])\) 然后因为只有 12 道题, ...
- 第六届蓝桥杯C++C组 A~F题题解
蓝桥杯历年国赛真题汇总:Here 1. 分机号 X老板脾气古怪,他们公司的电话分机号都是3位数,老板规定,所有号码必须是降序排列,且不能有重复的数位.比如: 751,520,321 都满足要求,而, ...
- 应届生必读:Java真实项目的开发流程和常用工具
本文出自本人写的书,谢绝转载,更勿抄袭. 本人有多年的Java面试官经验,经常要和一些包装项目经验的求职者打交道.当然平时也兼职做些Java面试辅导工作,最近也陆续帮一些在校生朋友成功找到Java工作 ...
- 如何用 7 分钟击破 Serverless 落地难点?
当前,Serverless 覆盖的技术场景正在不断变广.Serverless 已在微服务.在线应用.事件驱动.任务处理等众多场景被验证且广泛应用 .当你想要部署一个网站时,需要自己购买服务器并花费时间 ...
- Threejs实现一个园区
一.实现方案 单独贴代码可能容易混乱,所以这里只讲实现思路,代码放在最后汇总了下. 想要实现一个简单的工业园区.主要包含的内容是一个大楼.左右两片停车位.四条道路以及多个可在道路上随机移动的车辆.遇到 ...
- hdu 5547
***题意:4*4数独,要求在同一行同一列不能有相同的数字,另外在2*2的小单元里也不能有相同的数字 思路:DFS暴力搜索, 每个位置填1-4,递归回溯,判断是否符合条件,递归到最后一个位置+1则输出 ...
- 用C# WPF简单实现仪表控件
时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform.W ...
- SV 设计特性
过程语句块特性 ABC 过程块语句 always_comb 防止多驱动的问题:赋值块左侧的语句无法被另一个过程块赋值 if语句没有写else,sv会提示警告,sv认为是latch always不会再仿 ...