C#中面向对象的一些基础概念

news/2024/10/6 6:47:24

案例所创建的.cs如下:

  1. OOP --Object Oriented Programming
  • 实例化类
baseclass bc = new  baseclass();
subclass sc = new subclass();
bc.Func();
sc.Func();
  • 里氏转换
    • 子类对象可以直接赋值给父类变量
    • 子类可以调用父类对象,但是父类只有调用自己
    • 父类中如果是子类对象,则可以将父类强制转换为子类
//----------------------------------A.里氏转换知识点:----------------------------------
//里氏转换原则1.子类对象可以直接赋值给父类变量
sc.Alphabet = total.T;
bc.Alphabet = sc.Alphabet;
//里氏转换原则2.子类可以调用父类对象,但是父类只有调用自己
sc.bsfun();
//里氏转换原则3.父类中如果是子类对象,则可以将父类强制转换为子类
baseclass bc2 = new subclass();
subclass sc2 = new subclass();
sc2 = (subclass)bc2
  1. 抽象类以及抽象类不能被实例化
//a. 首先定义一个抽象类shape,包含一个抽象方法CalculateArea
public abstract class Shape
{//抽象方法public abstract double CalculateArea();//抽象类中也可以存在普通方法public void Display(){Console.WriteLine("display");}
}//b. 创建两派生类Circle和Rectangle,继承自基类
public class Circle:Shape
{public double Radius{get;set;}public Circle(double radius){Radius = radius;}//重写基类抽象方法public override double CalcualteArea(){return Math.PI*Radius*Radius;}
}public class Rectangle:Shape
{public double Width{get;set;}public double Height{get;set;}public Rectangle(double width, double height){Width = width;Height = height;}//重写基类抽象方法public override double CalculateArea(){return Width*Height;}
}//c. 使用派生类
class Program
{static void main(string[] args){//创建圆形对象Shape circle = new Circle(5);circle.Display();//创建矩形对象Shape rectangle = new Rectangle(6,4);rectangle.Display();}
}
  1. 静态类
//----------------------------------B.静态字段知识点:----------------------------------
//测试静态字段,
//静态字段可以被重新赋值
//实例或者对象可以在程序中开拓多个空间,即可以存在多个存储区,但是static在程序里面只会被开拓为一个内存区,不能被示例化。
//静态字段,静态方法都用类名.去调用
baseclass bc = new baseclass();
bc.name = "Test";
baseclass.address = "四川";
Console.WriteLine(baseclass.address);
  1. 委托
 //_______________________________delegate test____________________________________//1.委托一个和被委托方法一致的类型public delegate void setCallBack(int val);//写出需要被委托的方法public void setValue(int value){ textBox2.Text = value.ToString();}//需要新建线程来实现的方法public void txtBox(){setCallBack sV = new setCallBack(setValue);for (int i = 0; i < 100000; i++){//invoke,在该textBox2控件上执行委托,invoke配合委托使用,要求传入一个委托方法和参数textBox2.Invoke(sV,i);//this.Invoke(sV, i);//this表示form,这种用法是可以的//不使用invoke,报错:'Cross-thread operation not valid: Control 'textBox2' accessed from a thread other than the thread it was created on.'//setValue(i);//sV(i);}}//专门用于测试跨线程private void button5_Click(object sender, EventArgs e){Thread th = new Thread(txtBox);th.IsBackground = true; th.Start(); }
  1. 嵌套类
//----------------------------------D.嵌套类知识点:----------------------------------
//访问嵌套类
//嵌套类的简单理解就是类里面写类
baseclass.Person bc1 = new baseclass.Person();
bc1.run();
  1. 匿名类
//----------------------------------E.匿名类知识点:----------------------------------
//匿名类定义在方法或者函数里面
//定义一组匿名类
//匿名类一般用于存储一组只读属性
//匿名方法lambda,和py用法差不多
var lam = new { Name = "匿名", Properity = "只读" };
Console.WriteLine("{0}+{1}", lam.Name, lam.Properity);
Console.ReadKey();
  1. 密封类
//----------------------------------F.密封类知识点:----------------------------------
//实例化密封类
//sealed
seal se = new seal();
se.run();//创建一个密封类
//这是一个密封类,不能被子类找到和继承
public sealed class seal
{public void run(){Console.WriteLine("这是一个密封类,不能被子类找到和继承");Console.ReadKey();}}
  1. Object类
//----------------------------------G.Object类,拆箱装箱知识点:----------------------------------
//对object,拆箱和装箱进行讲解
public class test
{//object类//object里面公开的方法,可以被任何子类找到(Equals/GetHashCode/GetType/ToString)//按F12查看帮助//注意看大小写Object的区别,大写是类,小写是类型关键字object ob;Object ob1;//装箱和拆箱//装箱-值类型>引用类型//拆箱-引用类型>值类型//两种类型只有存在继承关系的时候,才可能出现装箱和拆箱操作。//装箱拆箱本质是堆空间和栈空间的互换,频繁互换会极大的拖累运算速度public void boxrun(){int a = 10;Console.WriteLine(a);Console.ReadKey();object b = a; //装箱Console.WriteLine(b);Console.ReadKey();a = (int)b;//拆箱,需要强转Console.WriteLine(a);Console.ReadKey();}}//Attribute--特性,Relfection--反射,可以做到不动程序框架,仅仅是新增类就可以做到把新增的类加到原来的框架里面
//泛型委托:Action和Func
//预处理方法
//泛型数组
//Lambda匿名方法
//以上属于具体需要再百度的高级应用
//process、Thread、Task、async、await等多种方法,用在winform或wpf上。百度具体使用案例即可
//string类和stringbiluder类。用stringbiluder类来解决string不可变性导致的内存占用过多的问题。
  1. 父类虚方法以及在子类中重写虚方法
  • 父类建立虚方法
        //----------------------------------父类虚方法 virtual--多态特征----------------------------------public virtual void Func(){ Console.WriteLine("父类的虚方法");Console.ReadKey();}
  • 子类重写虚方法
        //----------------------------------子类重写父类虚方法----------------------------------public override void Func(){// base.Func();---这条表示继承自父类,屏蔽可以只使用子类自己的方法,一般这个base用于公有的初始化方法,不屏蔽可以实现子类继承父类的公有方法。Console.WriteLine("子类的虚方法");Console.ReadKey();}
  1. 继承,接口,重载,构造函数,析构函数
    //----------------------------------子类----------------------------------//子类继承与父类//用:表示继承关系//,后加上接口,接口需要右键选择"快速动作和重构"来生成,不然要报错//在同一个项目内internal=public修饰符。系统默认用internal修饰类internal class subclass:baseclass,Interface1{//----------------------------------重载,有参构造函数,无参构造函数等同名函数同时存在叫做重载----------------------------------//1.子类构造函数,无参构造函数public subclass() { }//2.有参子类构造函数public subclass(total m_alp){ }//3.有参继承子类构造函数,用base关键字表示继承自父类public subclass(total m_alp, int m_wei, float m_siz, string m_sha):base(m_alp, m_wei, m_siz, m_sha){ }//----------------------------------析构函数,~函数名();用于手动释放资源----------------------------------
  1. 接口
namespace testForObject
{//----------------------------------接口----------------------------------//接口,需要单独添加一个接口,接口没有CLASS修饰//接口用于规范规范扩展的功能interface Interface1{//接口中不能包含字段//private string name;//接口中可以包含属性,属性是从哪里来的?//继承而来,接口可以多继承//接口中的成员不允许添加访问修饰符,默认都是public,//接口中的方法不能有方法体void Fly();//接口中全是abstract方法。但是却不能使用抽象修饰符。}
}
  1. 接口使用方法
  • 创建一个基类
    class Car{private string brand;public string Brand{ get { return brand; } set { brand = value; }}public Car(string brand) {this.brand = brand;}public void Run(){Console.WriteLine("{0}品牌的汽车在奔跑", brand);Console.ReadKey();}}
  • 创建一个接口
    //----------------------------------接口测试----------------------------------internal interface IFly{void Fly();}
  • 创建两个子类,其中一个会用到接口方法
    class BMWCar:Car{//初始化public BMWCar(string brand):base(brand){ }}
    class BatCar: Car,IFly{public BatCar(string brand):base(brand){ }//快速操作和重构,和接口抽象方法保持一直public void Fly(){Console.WriteLine("batCarCanFly");Console.ReadKey();}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/28542.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

c++17 推断指南(deduction guide)

namespace _nmsp2 {template<typename T>struct A{A(T val1, T val2){cout << "A::A(T val1,T val2)执行了!" << endl;}A(T val){cout << "A::A(T val)执行了!" << endl;}};template<typename T>A(T)->A<T>;…

为什么不建议使用Executors来创建线程池

不建议使用`Executors`类的静态方法(如`newFixedThreadPool`, `newSingleThreadExecutor`, `newCachedThreadPool`等)来创建线程池,主要基于以下几个原因: 1. 隐藏关键配置参数:`Executors`提供的便捷方法通常会隐藏线程池的重要配置参数,比如线程池的大小、工作队列类型…

hmac:Python密码消息签名

前言 HMAC算法可以用于验证信息的完整性,这些信息可能在应用之间传递,或者存储在一个可能有安全威胁的地方。 其基本思路:生成实际数据的一个密码散列,并提供一个共享的秘密密钥。然后使用得到的散列检查所传输或存储的信息,以确定一个信任级别,而不传输秘密密钥。 消息签…

socket:Python网络通信套接字

Socket网络通信套接字 socket库提供了一个底层C API,可以使用BSD套接字接口实现网络通信。它包括socket类,用于处理具体的数据通道,还包括用来完成网络相关任务的函数,如将一个服务器名转换为一个地址以及格式化数据以便在网络上发送。 什么是套接字? 套接字是程序在本地或…

el-upload以及blob自动根据列表名称匹配下载

dom文档<el-row :gutter="20"><el-col :span="16" :offset="0"><el-form-item label-width="120px" label="文件上传"><el-uploadref="upload"class="upload-file-uploader upload-dem…

振弦采集仪在岩土工程监测中的故障排除和维护要点

振弦采集仪在岩土工程监测中的故障排除和维护要点 河北稳控科技振弦采集仪在岩土工程监测中是一种常用的测量设备,通过测量振弦的振动频率来判断土体的力学性质和变形情况。然而,如果振弦采集仪出现故障,则会影响监测工作的正常进行。因此,掌握振弦采集仪的故障排除和维护要…

Mysql-事务的基本特性和隔离级别

0.背景 在数据库中,事务是一组数据库操作,可以将事务操作视为一个基本的工作单元。 1.事务的基本特性 事务的基本特性“ACID” 对于事务呢,就是这一组sql操作,要确保ACID这4个基本特性。 哎,八股文不好背,我记忆方式是:一元吃个(原持隔)原子性(Atomicity):事务中的…

使用pycnblog一键拖拽同步markdown和图片

目录原因解决办法参考链接准备工作配置config.yaml其他设置图片运行 原因本地使用Typora写完文档,上传博客园时,图片不能同步解决办法 参考链接博客园上传markdown文件准备工作下载工具pycnblog安装Python3pip install pyyaml配置config.yaml blog_url: https://rpc.cnblogs.…