-
接口就是指定一组函数成员,而不实现他们的引用类型查看全部
-
子类继承父类查看全部
-
通过指向派生类的基类引用,我们仅仅能访问派生类的基类部分。 Pet cat=new Cat(); cat.PrintName();//调用的是基类中的PrintName方法 但是如果是virtual和override情况下,会先在Pet中看到是虚方法,然后就去派生类中找有没有重写方法,调用重写过的方法查看全部
-
依赖倒置原则查看全部
-
虚方法和多态 关于虚方法的其他知识点 一、重写虚方法必须具有相同的可访问性,且基类方法不能是private 二、不能重写static方法或者非虚方法 三、方法、属性、索引器、事件,都可以声明virtual或override查看全部
-
隐藏方法的语法细节: 屏蔽数据成员:在派生类中声明和类型相同的成员 屏蔽函数成员:在派生类中声明新的带有相同函数签名的成员 让编译器知道:可以添加new关键字,否则会有警告查看全部
-
Object类是所有类的共同基类,它是唯一的非派生类,是继承层次结构的基础。对于其他类,父类和子类对的概念都是相对的。查看全部
-
通过指向派生类的基类的引用,我们仅仅能访问派生类中的基类部分。 Pet dog = new Dog(); 虚方法:声明为virtual的方法就是虚方法。基类的虚方法可以在派生类中使用override进行重写。 多态:通过指向派生类的基类引用,调用虚函数,会根据引用所指向派生类的实际类型,调用派生类中的同名重写函数,便是多态。 重写虚方法必须具有相同的可访问性,有基类方法不能是private。 不能重写static方法或者非虚方法。查看全部
-
记住!查看全部
-
面向对象的三个特点: 1、封装 2、继承 3、多态查看全部
-
interface查看全部
-
1、什么是约束 约束就是控制泛型这匹烈马的缰绳!缩小泛型参数的范围(无论多么泛泛,总有一个范围,范围越小越好控制) 2、约束的意义 只有添加了约束,才能调用泛型参数中(比如T)的方法。 对泛型类和方法都可添加约束。 3、约束的类型 类名 ——该类或者继承该类的类 class ——任何类 struct ——任何值 接口名 ——该接口类型或任何实现该接口的类型 new() ——带有无參共有构造函数的类 4、约束叠加规则(这三个约束可以任意存在) A、主约束,只能有一个(类名,class,struct) B、接口约束,可以有任意多个 C、构造约束 5、约束例子 void Cage<T,M> where T:Pet,IClibTree,new()//where约束哪个类型参数 where M:Pet,IClibTree,new() {···}查看全部
-
1、什么是泛型方法:就是方法的模型,给定具体的类型,就可以实例化出一个操作该类型的具体方法。 注意:泛型类中可以有泛型方法,普通类中也可以有泛型方法。 2、泛型方法语法 class Dog{ void DogIsHappy<T>(T target){//普通类中的泛型方法 ··· } } 实例 public void isHappy<T>(T target) { Console.Write("happy"+target.ToString()) } class Person{} ... var dog=new Dog("A"); dog.isHappy<Person>(new Person()); dog.isHappy<int>(3); 一个类的实例对象就相当于这个类类型的值; 比如 int 4;4是int类型的值; Person new person() ;new person()是Person类型的值或实例; 其实就相当于创建一个Person类,然后Person person=new Person(); person 就是Person的一个类型值查看全部
-
1、泛型类就是一个模子,放入类型的材料(字段属性方法),可以塑造出想要的产品。 2、语法 class Cage<T>//这是一个笼子类和泛型类,类名后加上一对<>,加上一个泛型参数 { T[] petArray;//定义T类型的数组 public void PutIn(T pet){···}//放入T类型的宠物 public T TakeOut(int index){···}//占位符T,cage类变为具体类时,T相应的变成具体数 } //实例化 var dogCage=new Cage<Dog>();//得到狗狗笼子 var catCage=new Cage<Cat>();//得到猫咪笼子 3、为什么需要泛型,用基类(包括所有类的基类object)或者公共的接口也可以实现一个Cage类,但是类型太宽泛,需要显示转换类型并判断真是类型是什么。 4、泛型使用:声明一个泛型类->引用泛型->构造实例 class Cage<t>{···} class Cage<Dog>{···} dogCage=new Cage<Dog>; 比如不写Petcage<Dog> dog=new Petcage<Dog> ("名字");而用一个从来没见过的 var代替。还有 return default<T>也没解释啥意思 理解:泛型就是在不确定类的参数类型和返回类型时,设置一个变量来代替这个固定的类型。当创建类实例时,在给这个变量赋对应类类型值,这样就可以实现一个类,输出不同类型的值和方法。 不用老师的例子,用一个给数组赋值输出数组的例子更好理解;如设置一个类,构造函数初始化一个数组数组类型为int,有给数组赋值方法和获取数组值的方法,在此注意:数组的类型int和获取数组值的方法的返回值类型都为int,如果实例此类调用方法,实参和返回值类型也必须是int;就此限定死了此类的实例; 如果想要一个设置char类型的实例,还得必须创建一个新的char的类和方法才能实现;这样代码工作量很大;若使用泛型,用变量<T>代替固定类型int或char,这样在实例化的时候,将T赋不同类型(int、double、char)就可以获得想要的返回值类型,从而实现了一个模板,只变一个参数T就能实现相同的功能 上面给出的例子。只需要把所有<T>去掉,后面的T全改为int或char 就能变为普通类了。对比理解非常简单了查看全部
-
1、什么是重载运算符 不能创造新的运算符,所以利用现有的某种运算符,针对自定义类或者结构(预定义类型和现有运算符的运算含义是确定的所有不能更改),定义某种运算符(该运算符和该操作具有一定相关性,如公狗狗+母狗狗=新生狗狗),从而简化自定义类型的操作。 2、语法细节 public static Dog operator +(Dog male,Dog female)//如公狗狗+母狗狗=新生狗狗 { ··· } 3、那些运算符可以重载 一元运算符:+、-、!、~、++、- -、true、false(操作数必须是类和结构) 二元运算符:+、-、*、%、&、|!、^、<<、>>、= =、!=、>、<、>=、<=(两个操作数至少有一个表示类或者结构) 不能重载:=、&&、||、[](索引操作)、()等 4、重载运算符不能做什么 创造新运算符 改变运算符语法 重定义运算符如何处理预定义类型 改变运算符的优先级和结合性 5、重在运算符举例 ··· public void ShowAge() { Console.WriteLine("Age="+_age); } ··· //重载自增操作,针对宠物的年龄 public static Pet opertor ++(Pet pet)//返回值为Pet类型,参数为宠物自身。所有的重载方法都需要public static修饰 { ++pet._age; return pet; } ··· Dog dog=new Dog("Jack"); dog._age=2; dog++; dog.ShowAge();查看全部
举报
0/150
提交
取消