以下是对长江雨课堂中c#错题的分析
类和继承练习
类的属性可以设置get和set方法,可以只有get那么这个属性就是只读的,也可以只设置set,那么这个属性就是可写的。但是不能get和set方法都没有!
这里的get和set方法和java中并不一样,但是效果类似,c#中的写法可以让程序员感觉是对属性的直接读取和修改。
例:
class A
{
//定义一个属性
String name;
public String Name
{
get {
return name;
}
set {
//这里的value是set方法中传来的参数值
name = value;
}
}
}
接下来我们创建一个main函数操作对象中的属性
class Program
{
static void Main(string[] args)
{
A a = new A();
a.Name = "test";
Console.WriteLine(a.Name);
}
}
注意点
- 类的属性默认是private,除了本类中其他的类是不允许访问的所以我们的get,set方法在实现的时候,必须声明为public
- 属性必须全部都是小写,因为get和set方法的取名就是必须把属性的第一个字母大写,比如name的方法名是Name
- get和set方法没有()直接写{ 方法体;}
- 再调用的时候必须写的是方法 比如a.Name而不是写a,name
A:构造函数不能被实例对象调用,构造函数只能被new关键字调用
C:构造函数可以被internal,protected,等等访问修饰符所修饰,其中默认的是public
D:构造函数没有返回值
在c#中创建子类对象时,会隐式调用基类的构造函数,若基类没有空的构造函数,且没有与子类相对应的构造函数时,可能会报错。 也可以通过base关键字显示调用基类的构造方法。
class Animal
{
public Animal(string name)
{
Console.WriteLine("Animal constructor called");
}
}
class Dog : Animal
{
//子类和父类对应
public Dog(string name) : base(name)
{
Console.WriteLine("Dog constructor called");
}
}
// 创建 Dog 对象时会依次调用 Animal 和 Dog 的构造方法
Dog dog = new Dog("Buddy");
在 C# 中,有以下几种访问权限修饰符:
public:公共访问权限,可以从任何地方访问。
private:私有访问权限,只能在当前类中访问。
protected:受保护访问权限,只能在当前类及其子类中访问。
internal:内部访问权限,只能在当前程序集(文件)中的任何位置访问。
以及两种特殊的:
protected internal 这个结合的protected和internal的功能,让被这两个关键字的类既可以被同个文件夹中的类访问,也可以被派生类访问。
private protected
这个关键字修饰的类,只能被同一个文件夹下的派生类访问。
构造函数是一种特殊的函数,没有返回值类型也不用void修饰。
析构函数会被回收器自动调用,不会被显式调用。
protected:可以被子类和父类访问
private:只能本类访问。
哪怕通过base关键字也不能访问private修饰的方法。
get,set方法,main函数等等 甚至可以直接在类中定义另外一个类
在c#中父类对象可以引用子类对象,但反过来不行,引用是指父类对象可以被赋值成子类对象。
本章总结
本章是面向对象的开始,介绍了一些面向对象的基本知识,以下是我认为这70题的考察重点
- 对象和类的定义
- 对象一定是具体的,而类是抽象的
- 面向对象的逻辑是“万物是对象”
- 在c#语言中,所有类的父类是object类
- c#中类的构造函数
- 构造方法名一定和类名相同
- 构造方法是特殊的函数,对象实例无法调用,是通过new关键字来进行调用的
- 如果类本身没有定义构造方法那么默认会有一个空的构造方法
- 构造派生类的对象时,会先调用父类的构造方法,除了这种隐式调用以外,也可以用base关键字调用
- c#类中的get和set方法
- 具体的语法我写在上面题目中了,其中需要注意的是
- get和set方法的方法名是属性的第一个字母大写,如果只有get方法那么这个属性是只读的,如果只有set方法那么这个方法是只写的。
- get和set方法可以只有一个,也可以都存在,但是不能一个都没有。
- c#的继承特点
- c#只支持单一继承,也就是所有的类只有一个父类,但是一个父类可以有多个派生类。
- 虽然只支持单一继承,但是可以有多个接口
- 语法 : 子类:父类
- 访问权限
- private:只有当前类可以访问
- protected:只有当前类和派生类可以访问
- internal:只有同一个文件夹下的可以访问
- public:所有人都可以访问
虚方法练习
在c#中并不是所有的方法都可以重写,而是虚方法可以重载和重写,要用virtual关键字来修饰。
在派生类重写和重载虚方法时new和override有以下的区别!!(重点)
- new关键字是覆盖,并不是完全消除,当父类引用子类时,new关键字修饰的方法还是会调用父类的方法
- 而override是完全把父类的删除掉了,当父类引用子类时,调用的就是子类的方法。
sealed关键字密封类,密封类不能被任何类继承。
注意:不是一起使用,virtual在父类中,而override在子类中。
实现多态的关键字是override,new是对基类的方法的隐藏,而并没有重写,并没有实现多态
总结
这里是对虚方法的解释,虚方法和虚属性,特别注意的是,虚方法必须用virtual关键字修饰,new和override是不同的 new是覆盖并不是多态,override才是重写,实现了多态。
特别注意的是,父类的对象可以引用子类对象,引用之后,如果调用他们两个相同名的方法,如果new 那么就调用父类的方法,override就是调用子类的方法。
抽象类接口练习
接口中不可以有常量的定义
抽象类不能是密封类