C#学习记录4——结构体,接口

1.结构体

对于C++语言来说,其实结构体和类几乎没有什么太大的区别。类能够实现的功能,使用结构体大部分也可以。

不过,在C#里面,我们把结构体看作是一种轻量的类的替代品。它和类一样有构造方法,属性,成员属性/数据,甚至是操作符。注意struct构造方法必须有传入参数。

当然struct也不是完全支持类的所有功能的。

首先,结构体无法进行继承。也就是说,结构体不想类那样灵活,代码也无法复用。

其次,也是非常重要的一点:结构体是一种值类型,而类是引用类型。这两种类型的区别,可以查看C#学习记录3上,里面关于类的第一点。

总的来说,一般只在定义一些内容小,较简单的类型时才会用到结构体。

结构体的声明十分的简单,这里就不举例了。

2.接口

C#和Java支持结构,而C++是不支持的。

如果你了解抽象类是个什么鬼,那么这个接口跟他差不多的东西。

接口优于抽象类的地方在于:当类继承了某个抽象类时,那么这个抽象类就作为基类存在。而接口则是将一种合同式的约定混入到已成立的继承树中。

这句话可以理解为,由于C#的单继承要求(即一个子类只能继承一个父类),而当希望“继承”多个不同的类时,就无法通过继承实现了。而类是可以实现多个接口的

1 abstract class Walk
2 {
3     abstract public void SomeMethod();
4 }
1 interface IWalk //接口的命名一般以大写I开头
2 {
3     void SomeMethod();
4 }

上面两段代码,一个事抽象类,一个是接口。现在考虑如果我们有另一个类Run,现需要创造一个Person类同时继承Walk和Run(人既能跑又能跳)。

public class Person: Walk, Run
{
}

这种方法就不能实现,因为一个类不能由多个父类

public class Person: IWalk, Run
{
}

只能这样实现。在继承树中,Run是Person的父类,而IWalk只是在Person上加入的协定,不影响继承树

既然介绍了允许继承多个接口,那么自然而然就产生了一个疑问:如果继承的两个接口中有同名的方法,那怎么办?

 1 interface IProgrammer
 2 {
 3     void Work();
 4 }
 5 interface IWriter
 6 {
 7     void Work();
 8 }
 9 public class Person1: IProgrammer, IWriter
10 {
11     void IProgrammer.Work()           //显示实现
12     {
13
14     }
15     public virtual void Work()        //隐式实现
16     {
17
18     }
19 }

如上例所示。作为程序员和作家,都有工作的方法,如果某个人在编程的同时还出版图书,那么他就同时实现了两份工作,而区分两份工作Work的最好方法是通过显示实现。
即用接口名.方法名的形式说明。不过,显示实现不能设置访问修饰字(即public,private等),他被默认为是公共的。另外显示实现的方法还不能使用abstract,virtual,override,new修饰字。并且对于Person1的某一个对象来说,直接通过对象来访问Work方法是会被理解成调用隐式实现的某个方法。将该对象强制转换成对应接口类型: Person1 p = new Person1(); IProgrammer pAsProg = p; pAsProg.Work();

上面说了强制将Person1的实例转换成IProgrammer。除了上面的方法,另外一种是使用as操作符。

IProgrammer pAsProg = p as IProgrammer;

as操作符有左右两个值。它将左值转换为右值所指明的类型,如果不能成功转换,则返回null。

时间: 2024-10-13 02:27:46

C#学习记录4——结构体,接口的相关文章

c#学习笔记之结构体和接口

一.结构体 个人认为结构体就是一种简化的类,类和结构体的功能基本上差不多.但是,结构体与类在语法以及使用上也有一定的区别. 1.结构体是值类型(value types),而类是引用类型(reference types) 2.不像类一样,结构体可以不使用new来实例化一个对象. 3.结构体能声明构造函数,但是必须传入参数. 4.结构体不能从另一个结构体或类继承. 结构体的声明: public struct man { methods; } 二.接口(interface) C#中只允许单继承,也就是

C#学习笔记之结构体

1.概述 结构是一种与类相似的数据类型,不过它较类更为轻量,一般适用于表示类似Point.Rectangle.Color的对象.基本上结构能办到的类全都能办到,但在某些情况下使用结构更为合适,后面会有提到. 结构具有以下特点: 结构可以实现接口. 结构可以声明带参数的构造函数. 结构不能声明默认构造函数(没有参数的构造函数)或析构函数. 结构是值类型,而类是引用类型. 实例化结构体时可以不使用new运算符. 结构类型是不可抽象.隐式密封的,故不能使用abstract和sealed修饰符. 在结构

Swift学习之类和结构体的创建

随着一步步的学习,学习到的新知识越来越多了,不管是新的还是旧的,都禁不住时间的堆积,再熟悉的知识点时间久了都会渐渐的忘记,也许这就是人们生活中一种潜在的惰性吧,看似非常熟悉的东西,等到真正要用的时候,却拿不出手来,总是似懂非懂的,所以无论知识点多么多,过的时间多久,我们都要经常拿出来练习下,以免忘记.这些对于我们来说都是非常重要的,有的人会认为我记性非常好,写一遍都可以记住,但是真的是这样吗,所话说的好,好记性不如烂笔头,说的就是那些好吃懒做的人,所以我希望大家都可以多动手,经常练习我们所学过的

C++容器学习,与结构体排序和set来一场邂逅

最近学习C++容器,积累一下.下面介绍set和multiset,并使用sort对结构体进行排序.C++之路漫漫其修远兮! 一.对结构体进行排序 // sort_struct.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <vector> #include <algorithm> using namespace std; typedef struct e

Nginx学习之三-ngx_http_request_t结构体

ngx_http_request_s是nginx中非常重要的一个结构体,贯穿于htpp请求处理的整个过程中. 下面解释了ngx_http_request_s结构体中与HTTP框架相关的重要的成员变量. [cpp] view plaincopyprint? struct ngx_http_request_s { uint32_t                          signature;         /* "HTTP" */ //请求对应的客户端连接 ngx_connec

C语言学习笔记-9.结构体

一.结构体的定义与使用 1.结构体内部的每个变量称为字段或成员变量 2.定义方法:struct <结构体标记> {-}; 或 typedef struct {-} <结构体类型名>; 变量定义:struct <结构体标记> 变量1,2- 或 <结构体类型名> 变量1,2- 3.成员变量的访问: x.成员变量名           (*px).成员变量名           px->成员变量名 "->"称为指向运算符或箭头运算符

20150920学习内容:结构体及题目:定义一个学生的结构体,学号,姓名,身高,输入学生信息,按身高排序输出

结构体:用户自定义数据类型,实际就是变量组,可以一次存多个不同变量 结构体定义在main函数的外面 Struck 结构体名 { // 元素一 // 元素二 } 题目:定义一个学生的结构体,学号,姓名,身高,输入学生信息,按身高排序输出

Swift学习(类和结构体)

类和结构体: 相同点: 1.都可以定义属性 2.都可以定义方法,这一点是Swift根C,OC的明显区别之一 3.他们都可以定义构造器(初始化方法) 4.都可以遵循协议 5.他们都可以被扩展 不同点: 1.类可以被继承,而结构体不可以 2.类可以被类型推断 3.类可以通过 析构(dealloc) 释放内存 4.类是 引用类型, 结构体是 值类型 使用 class 和 struct 来分别表示类和结构体 定义 类 class Car { var name : String? func printNa

C语言学习入门 (八) 结构体和枚举

结构体 它允许内部的元素是不同类型的 结构体的定义 //结构体类型: struct Person { char name[20]; //char *name; int age; float weight; }; //定义一个结构体变量,定义变量时才分配存储空间 structPerson person;    //与类型定义一起使用 struct Student {  //结构体类型与变量同时定义 char *name; int age; } stu; struct {  //省略类型,结构体变量