(4)C#的“假类”和数组

大家都知道java是单继承语言,想要继承多个类,就要靠接口去实现了。C#中也是一样,众多的接口为编程提供了极大的便利。自己定义接口也是个不错的选择。生活中一个儿子想继承多个父亲的财产是不可能的,天上不能掉馅饼,接口能提供给每个类的只是一个个函数的空壳,所有的方法都要类自己实现。人人公平,不搞特殊化。简单的接口实现:

完整的代码如下:

namespace ConsoleApplication4

{

public interface Ifirst

{

void readblog();

}

interface Isecond

{

void readblog2();

}

class Program :Ifirst , Isecond

{

public void readblog(){

Console.WriteLine("第一个接口被实现");

}

public void readblog2()

{

Console.WriteLine("第二个接口被实现");

}

static void Main(string[] args)

{

Program a = new Program();

a.readblog();

a.readblog2();

}

}

}

有些同学要问了,如果两个接口中有同名函数,但是函数都干着不同的事情怎么办?C#提供了隐式定义和显示定义两种方法,来解决这个问题:

namespace ConsoleApplication4

{

public interface Ifirst

{

void readblog();

}

public interface Isecond

{

void readblog();

}

class Program :Ifirst , Isecond

{

//隐式定义

public void readblog(){

Console.WriteLine("第一个接口被实现");

}

//显示定义

void Isecond.readblog()

{

Console.WriteLine("第二个接口被实现");

}

static void Main(string[] args)

{

Program a = new Program();

a.readblog();

Isecond b = a;

b.readblog();        //调用显示定义的readblog()

}

}

}

从上面这个例子看,接口是不是更具有类的特征?语言设计师的意图从不拘泥于一种样式,既然有了多继承,那就弄出个接口的概念,比继承父类更加灵活多变。

还有一个关键字很生动形象,叫where

Where的用法

where 子句用于指定类型约束,这些约束可以作为泛型声明中定义的类型参数的变量。
 1.接口约束。
 例如,可以声明一个泛型类 MyGenericClass,这样,类型参数 T 就可以实现 IComparable<T> 接口:

public class MyGenericClass<T> where T:IComparable { }

2.基类约束:指出某个类型必须将指定的类作为基类(或者就是该类本身),才能用作该泛型类型的类型参数。
 这样的约束一经使用,就必须出现在该类型参数的所有其他约束之前。

class MyClassy<T, U>
 where T : class
 where U : struct
{
}听说过不规则数组吗?C#里就能实现,对于这种长得很难看的东西,C#有自己的办法。

namespace ConsoleApplication4

{

class Program

{

public void displayvalue(params int[] values)

{

foreach (int i in values)

{

Console.WriteLine("displayvalues {0}", i);

}

}

static void Main(string[] args)

{

Program a = new Program();

a.displayvalue(3, 4, 5, 8, 9);

int[][] jagarray;

jagarray = new int[3][] { new int[4], new int[6],new int[8] };

jagarray[0][3] = 34;

jagarray[2][2] = 54;

}

}

}

里面还有个关键字params,聪明的读者能想到它是干什么的吗?若急切想知道答案,可在博客下方评论。。

此外,还有一种直接定义数组的方法,还能确定数组的上界和下界。

public class SAB

{

public static void CreatArrayWithBounds(){

int []lengthsArray = new int[2]{3,5};

int []boundsArray = new int [2]{2,3};

Array mutiDimension = Array.CreateInstance(typeof(string),lengthsArray,boundsArray);

Console.WriteLine("Bounds:\tLower\tUpper");

for(int i=0;i<mutiDimension.Rank;i++)

{

Console.Write("Rank: {0}\t",i);

Console.Write(mutiDimension.GetLowerBound(i)+"\t");

Console.Write(mutiDimension.GetUpperBound(i)+"\n");

}

}static void Main()

{

SAB.CreatArrayWithBounds();

}

}

这里维度的概念很重要,在这个例子中,维就是行和列。Rank指的就是数组的维度,这种指明界限的数组,使越界的风险大大降低。

时间: 2024-10-04 06:51:01

(4)C#的“假类”和数组的相关文章

Unit02-OOP-对象和类,数组(下)

Unit02-OOP-对象和类,数组(下) 1.方法的签名: 方法名+参数列表 2.方法的重载(Overload):  1)发生在一个类中,方法名称相同,参数列表不同  2)编译器在编译时自动根据签名绑定调用不同的方法 3.构造方法:  1)常常给成员变量赋初值  2)与类同名,没有返回值类型  3)在创建(new)对象时被自动调用  4)若自己不写构造方法,则编译器默认一个无参构造方法,    若自己写了构造方法,则编译器不再默认提供  5)构造方法可以重载 4.this:指代当前对象,哪个对

Java Arrays类对数组的常用操作

1.数据的遍历 public class TestClass { public static void main(String[] args) { /*二维数组,每一维可以不一样*/ int a[][] = new int[][]{{1,2,3},{4,5,6},{8,9,10,7}}; Arrays.sort(a[2]); for(int i=0; i<a.length; i++) { for(int j=0; j<a[i].length; j++) { System.out.println

mfc 类对象数组

知识点 类对象数组定义 类对象数组初始化 一.类对象数组定义 我们声明类对象数组,与我们申明内置类型数组的形式完全相同. 如: int a[3]; float b[3]; Tdate d[3]; 二.类对象数组的初始化 1.调用默认构造函数,每个数组成员都会调用一次 如Tdate d[3] 则会调用3次构造函数. 2.手动初始化. 代码 #include "stdafx.h" #include <malloc.h> #include "date.h" i

C/C++中,空数组、空类、类中空数组的解析及其作用

转自:http://blog.sina.com.cn/s/blog_93b45b0f01015s95.html 我们经常会遇到这些问题: (1)C++中定义一个空类,他们它的大小(sizeof) 为多少? (2)只有一个char数据成员的类的大小? (3)能否定义一个空数组? (4)空数组名做标示的指针指向什么地方? (5)空类有什么用? (6)空数组有什么用? 等等...... 这些问题,笔者在这篇文章统统做一个比较详细的解析和认识.   1. sizeof是什么? 首先我们要理解sizeof

类内数组声明,“类外”指定大小

类内数组声明,“类外”指定大小 using namespace std; class Age{ public: static const int Value = 10; static const int ages[]; }; const int Age::ages [] = {1,2,3}; int main() { cout << "xxx Age:" << Age::Value << "ages size:"<<

scanf函数和cin的区别、类的数组、C++排序函数

给定n个字符串,将这n个字符串按照字典序进行排列,此处用排列函数是C++的库函数sort,产生如下两个疑问,望大佬解答 #include <iostream> #include <algorithm> #include <string> #include <vector> using namespace std; /* ********************************************** Q1:为什么定义类的数组,无法用sort函数排

设计数组类扩展数组的功能

建立专门的数组类处理有关数组的操作 数组是几乎所支持的组织数据的方法.C和C++对数组类型提供了内置支持,使我们利用数组实现软件中需要的各种实用的功能.但是,这种支持仅限于用来读写单个元素的机制.C++不支持数组的抽象abstraction,也不支持对整个数组的操作.例如:把一个数组赋值给另外一个数组,对两个数组进行相等比较或者想知道数组的大小size,等等.对C++而言,数组是从C语言中继承来的,它反映了数据与对其进行操作的算法的分离,有浓厚的过程化程序设计的特征.数组并不是C++语言的一等公

Java学习日记-4 StringBuffer类和数组

一.StringBuffer类 StringBuffer是一个可变字符序列. 1.1 构造函数 StringBuffer() 构造一个不带字符的字符缓冲区,初始容量为16个字符. StringBuffer(int capacity) 构造一个具有指定初始容量的字符缓冲区 StringBuffer(String str) 构造一个内容为指定字符串的字符缓冲区,初始容量为字符串容量加上16 1.2 StringBuffer类的常用方法(StringBuffer没有静态方法) 1.2.1 String

字典转模型,模型转字典,将某个类中数组直接转换成模型

/** *  数组中需要转换的模型类 * *  @return 字典中的key是数组属性名,value是数组中存放模型的Class */ - (NSDictionary *)objectClassInArray; 使用实例: @property(nonatomic,strong)NSArray *pic_urls; - (NSDictionary *)objectClassInArray{ return @{@"pic_urls":[StatusPhoto class]}; } NSA