c# 中的类

news2024/11/25 20:36:42

反射 Activator.CreateInstance

class Program
{
    static void Main(string[] args)
    {
        //反射
        Type t = typeof(Student);
        object o = Activator.CreateInstance(t, 1, "FJ");
        Student stu = o as Student;
        Console.WriteLine(stu.Name);
        //动态编程
        dynamic stu2 = Activator.CreateInstance(t, 2, "XB");
        Console.WriteLine(stu2.Name);
    }
}
class Student
{
    public Student(int id, string name)
    {
        this.ID = id;
        this.Name = name;
    }
    public int ID { get; set; }
    public string Name { get; set; }
}

静态构造器只能定义静态成员

声明一个类,创建一个实例或创建一个对象

成员类

class Program
{
    static void Main(string[] args)
    {
       
    }
  	class Student
    {

    }
}

上面的Main方法是类成员,而Student是成员类

类的访问级别

internal代表此类可作用于当前assembly集中。

namespace MyLib.MyNamespace
{
    internal class Calculator
    {
        public double Add(double a, double b)
        {
            return a + b;
        }
    }
}
namespace MyLib.MyNamespace2
{
    class Student
    {
        public Calculator Calculator { get; set; }
    }
}

其中MyNamespace和MyNamespace2在同一个assembly -- MyLib中。

类的继承

namespace HelloClass
{
    class Program
    {
        static void Main(string[] args)
        {
            Type t = typeof(Car);
            Type tb = t.BaseType;
            Type tTop = tb.BaseType;
            Console.WriteLine(tTop.FullName);
            //true
            Console.WriteLine(tTop.BaseType==null);
            Vehicle vehicle = new Vehicle();
            //false
            Console.WriteLine(vehicle is Car);
            Car car = new Car();
            //true
            Console.WriteLine(car is Vehicle);

            Vehicle vehicle2 = new Car();
            Object o1 = new Vehicle();
            Object o2 = new Car();

        }
    }
}

class Vehicle
{

}
class Car : Vehicle
{

}

子类的实例从语义上来说也是父类的实例

基类继承自某个基类或派生某个基类;

某个类实现了某个基接口

继承的本质是派生类在基类已有的成员的基础上对基类进行横向和纵向的发展

当父类是自定义的有参构造器子类怎么解决


//解决方案1
public Car() : base("N/A")
{
    this.Owner = "Car Owner";
}
//解决方案2
public Car(string owner):base(owner)
{

}

构造器是不能被继承的!!

private表示此属性只能被类中的其他成员访问

protected把类成员的访问级别限制在继承链上

重写和多态

class Vehicle
    {
        public virtual void Run()
        {
            Console.WriteLine("I'm running!");
        }
    }
    class Car:Vehicle
    {
        public override void Run()
        {
            Console.WriteLine("Car is running!");
        }
    }

属性重写

class Program
    {
        static void Main(string[] args)
        {
            Car car = new Car();
            car.Run();
            Console.WriteLine(car.Speed);
            Vehicle vehicle = new Vehicle();
            vehicle.Run();
            Console.WriteLine(vehicle.Speed);
        }
    }
    class Vehicle
    {
        private int _speed;
        public virtual int Speed { 
            get {return _speed; }
            set {_speed=value; }
        }
        public virtual void Run()
        {
            Console.WriteLine("I'm running!");
            _speed = 100;
        }
    }
    class Car:Vehicle
    {
        private int _rpm;
        public override int Speed
        {
            get { return _rpm / 100; }
            set { _rpm = value * 100; }
        }
        public override void Run()
        {
            Console.WriteLine("Car is running!");
            _rpm = 5000;
        }
    }

多态的表现内容

多态的表现内容是当用一个父类类型的变量去引用子类类型实例的时候,当我们调用一个方法的时候,这个方法最终所被调用的版本是由对象的类型决定。它一定是能够调到这个继承链上最新的版本。最新的版本可能存在于我们的一个子类对象当中,也可能在重写过程当中被某一个隐藏给打断了

class Program
    {
        static void Main(string[] args)
        {
            Vehicle car = new Car();
            car.Run();
            Console.WriteLine(car.Speed);
            Car vehicle = new RaceCar();
            vehicle.Run();
        }
    }
    class Vehicle
    {
        public virtual void Run()
        {
            Console.WriteLine("I'm running!");
        }
    }
    class Car:Vehicle
    {
        public override void Run()
        {
            Console.WriteLine("Car is running!");
        }
    }
    class RaceCar:Car
    {
        
        public override void Run()
        {
            Console.WriteLine("Race car is running !"); 
        }
    }

接口和抽象类

solid设计模式

是五个面向对象基本设计原则的首字母的缩写,分别是:

single responsibility principle 单一职责原则(SRP)

open close principle 开闭原则(OCP)

liskov substitution principle 里氏替换原则(LSP)

interface segregation principle 接口隔离原则(ISP)

dependency inversion principle 依赖反转原则(DIP)

class Program
    {
        static void Main(string[] args)
        {
            Vehicle v = new RaceCar();
            v.Run();
        }
    }

    abstract class Vehicle
    {
        public void Stop()
        {
            Console.WriteLine("Stopped!");
        }
        public void Fill()
        {
            Console.WriteLine("Pay and fill...");
        }
        public abstract void Run();
    }
    class Car : Vehicle
    {
        public override void Run()
        {
            Console.WriteLine("Car is running!");
        }
    }
    class Truck : Vehicle
    {
        public override void Run()
        {
            Console.WriteLine("Truck is running!");
        }
    }
    class RaceCar : Vehicle
    {
        public override void Run()
        {
            Console.WriteLine("Race car is running!");
        }
    }

接口:类中的所有成员方法都是纯虚函数抽象的,且都是public

class Program
    {
        static void Main(string[] args)
        {
            Vehicle v = new RaceCar();
            v.Run();
        }
    }

    interface IVehicle
    {
        void Stop();
        void Fill();
        void Run();
    }

    abstract class Vehicle:IVehicle
    {
        public void Stop()
        {
            Console.WriteLine("Stopped!");
        }
        public void Fill()
        {
            Console.WriteLine("Pay and fill...");
        }
        public abstract void Run();
    }
    class Car : Vehicle
    {
        public override void Run()
        {
            Console.WriteLine("Car is running!");
        }
    }
    class Truck : Vehicle
    {
        public override void Run()
        {
            Console.WriteLine("Truck is running!");
        }
    }
    class RaceCar : Vehicle
    {
        public override void Run()
        {
            Console.WriteLine("Race car is running!");
        }
    }

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

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

相关文章

【算法】二分相关题目

文章目录 二分相关二分查找在排序数组中查找元素的第一个和最后一个位置寻找峰值x 的平方根0~n-1中缺失的数字## 搜索插入位置 二分相关 二分查找 https://leetcode.cn/problems/binary-search/ 在一个有序数组当中,查找值为target的元素,返回下标 cla…

SSM - Springboot - MyBatis-Plus 全栈体系(十七)

第三章 MyBatis 五、MyBatis 高级扩展 1. mapper 批量映射优化 1.1 需求 Mapper 配置文件很多时,在全局配置文件中一个一个注册太麻烦,希望有一个办法能够一劳永逸。 1.2 配置方式 Mybatis 允许在指定 Mapper 映射文件时,只指定其所在的…

2023年中国家用智能门锁市场发展概况分析:家用智能门锁线上市场销量290.4万套[图]

智能门锁是指区别于传统机械锁的基础上改进的,在用户安全性、识别、管理性方面更加智能化简便化的锁具。智能门锁是门禁系统中锁门的执行部件。智能门锁区别于传统机械锁, 是具有安全性, 便利性, 先进技术的复合型锁具。 智能门锁级别分类 资料来源:共研…

MARS: An Instance-aware, Modular and Realistic Simulator for Autonomous Driving

● MARS: An Instance-aware, Modular and Realistic Simulator for Autonomous Driving(基于神经辐射场的自动驾驶仿真器) ● https://github.com/OPEN-AIR-SUN/mars ● https://arxiv.org/pdf/2307.15058.pdf ● https://mp.weixin.qq.com/s/6Ion_DZGJ…

flink处理函数--副输出功能

背景 在flink中,如果你想要访问记录的处理时间或者事件时间,注册定时器,或者是将记录输出到多个输出流中,你都需要处理函数的帮助,本文就来通过一个例子来讲解下副输出 副输出 本文还是基于streaming-with-flink这本…

解决SpringBoot Configuration Annotation Processor not configured

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 问题描述 在使用ConfigurationProperties注解和EnableConfigurationProperties注解时,IDEA报错:SpringBoot Configuration Annotation Processor no…

【chainlit】使用chainlit部署chatgpt

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

微服务架构改造案例

最后一个部分,结合我们自己的财务共享平台项目进行了微服务架构改造案例分析。 对于改造前的应用,实际上存在四个方面的问题。 其一是关于高可用性方面的,即传统的单体应用我们在进行数据库水平扩展的时候已经很难扩展,已经出现…

XShell远程连接Ubuntu

环境 系统:Ubuntu 18.04.6 LTS IP:192.168.1.4 ps:查看ubuntu版本 lsb_release -a 查看ubuntu的ip地址 Ubuntu系统准备工作 root权限 打开ubuntu系统后,打开终端,切换为root权限:su root 如果出现su root认证失…

管理经济学基本概念(五):一些基本术语

1、理性-行动者范式 使经济学家行动一致的东西就是采用理性-行动者范式来预判人的行为。简单地说,这个范式认为人们的行动式理性的、优化的和自利的。 2、税后净营业利润 税后经营净利润(NOPAT)是指将公司不包括利息收支的营业利润扣除实付所得税税金之后的数额加…

Acwing 907. 区间覆盖

Acwing 907. 区间覆盖 知识点题目描述思路讲解代码展示 知识点 贪心 题目描述 思路讲解 代码展示 #include <iostream> #include <algorithm>using namespace std;const int N 100010;int n;struct Range {int l, r;bool operator < (const Range &W) …

【day11.02】网络编程脑图

大小端存储&#xff1a; ip地址划分&#xff1a;

MySQL 锁分类和详细介绍

锁是计算机协调多个进程或线程并发访问某一资源的机制&#xff0c;在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源&#xff0c;锁机制是保证数据一致性和并发性的重要手段&#xff0c;它…

软件设计模式系列之二十二——状态模式

1 模式的定义 状态模式是一种行为型设计模式&#xff0c;它允许对象在内部状态发生改变时改变其行为&#xff0c;使得对象的行为看起来像是改变了其类。状态模式将对象的状态抽象成一个独立的类&#xff0c;让对象在不同状态下具有不同的行为&#xff0c;而且可以在运行时切换…

做一个优秀的博士生,时间的付出是必要条件

&#xff0a;图片来自管理学季刊 时间的付出 所有成功的科学家一定具有的共同点&#xff0c;就是他们必须付出大量的时间和心血。这是一条真理。实际上&#xff0c;无论社会上哪一种职业&#xff0c;要想成为本行业中的佼佼者&#xff0c;都必须付出比常人多的时间。有时&…

【知识点随笔分析 | 第六篇】HTTP/1.1,HTTP/2和HTTP/3的区别

前言&#xff1a; 当今互联网已成为人们生活的重要组成部分&#xff0c;而HTTP协议&#xff08;Hypertext Transfer Protocol&#xff09;是支持Web通信的基础。随着Web技术的发展和互联网应用的不断增多&#xff0c;HTTP也在不断演进。本文旨在介绍HTTP的演变过程中的三个重要…

【Godot4.1】Godot实现闪烁效果(Godot使用定时器实现定时触发的效果)

文章目录 准备工作创建Sprite2D创建Timer节点 编写脚本完整代码运行效果 准备工作 如果你希望配置C#编写脚本&#xff0c;可以查看如下教程&#xff1a; Godot配置C#语言编写脚本 创建Sprite2D 首先弄一个用于显示的Sprite2D&#xff0c;右键单击任意节点&#xff0c;然后选…

Transformer在小目标检测上的应用

本篇文章是博主在AI、无人机、强化学习等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在AI学…

mysql双主互从通过KeepAlived虚拟IP实现高可用

mysql双主互从通过KeepAlived虚拟IP实现高可用 在mysql 双主互从的基础上&#xff0c; 架构图&#xff1a; Keepalived有两个主要的功能&#xff1a; 提供虚拟IP&#xff0c;实现双机热备通过LVS&#xff0c;实现负载均衡 安装 # 安装 yum -y install keepalived # 卸载 …

反向输出一个三位数

系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…