1,子类
子类有父类的public属性与方法。
你只能有一个父类。
namespace a {
public class Program {
public static void Main(string[] args) {
B s1 = new B();
s1.name = "张三";
s1.say();
}
}
public class A {
public string name;
public void say() {
Console.WriteLine($"我叫{
name}");
}
}
public class B : A {
}
}
效果:
2,调用父类的构造
在构造后面加冒号。
namespace a {
public class Program {
public static void Main(string[] args) {
B s1 = new B("张三", 23);
s1.say();
}
}
public class A {
public string name;
public A(string name) {
this.name = name;
}
public void say() {
Console.WriteLine($"我叫{
name}");
}
}
public class B : A {
public int age;
public B(string name, int age) : base(name) {
this.age = age;
}
public void say() {
Console.WriteLine($"我叫{
name},今年{
age}岁");
}
}
}
效果:
3,隐藏父类的成员
之前的例子已经重写了,但不够完全。
子的方法需要加上new关键字:
public new void say() {
Console.WriteLine($"我叫{
name},今年{
age}岁");
}
如此,父类中的say方法会被隐藏。
子类中所有的say都是子类自己的。
4,里氏替换原则
所有父类的实例,都可以替换成子类,功能没有任何的影响。
比如,案例中的B类对象可以用A类接收。
namespace a {
public class Program {
public static void Main(string[] args) {
A s1 = new B("张三", 23);
s1.say();
}
}
public class A {
public string name;
public A(string name) {
this.name = name;
}
public void say() {
Console.WriteLine($"我叫{
name}");
}
}
public class B : A {
public int age;
public B(string name, int age) : base(name) {
this.age = age;
}
public new void say() {
Console.WriteLine($"我叫{
name},今年{
age}岁");
}
}
}
5,访问修饰符
只在项目内使用,有三种:
private:只有类内部。
private protected:加上当前项目的子类。
internal:当前项目任意位置。
外部可以访问的有三种:
protected:任意子类。
protected internal:当前项目,以及外部子类。
public:都可以。