【C#基础】继承、封装、多态、接口

本文详细介绍了 C# 中的继承、接口、虚方法、抽象类、密封类等面向对象高级特性,并探讨了 as 和 is 运算符的使用及方法重载规则。

继承:

派生(类、接口)

虚方法(Virtual)

一个类只能有一个基类,但是可以继承多个接口。

但是类可以有 多层继承 即:类B继承类A  类C又继承类B。

在基类中声明Virtual 子类可以实现也可以实现Virtual

如果要实现的话 要用Override 重写基类方法或属性。

重写:签名(所有参数类型和方法名)和放回类型必须一致

成员字段和静态方法都不能声明为Virtual

方法和属性可以声明为Virtual 两者用法是一样的。

new 关键字作用

1:实例化对象

2:new 关键字隐藏方法。但是不要刻意去用这个 主要用于处理版本冲突。

base:

base 关键字可以调用任何基类的方法,而不仅仅是重写的方法。

抽象类和抽象方法。

类和方法允许声明为abstract。抽象类不允许实例化 抽象方法不能直接实现,必须在非抽象类的派生类中重写。

Sealed:

sealed可以装饰类和方法:

 给类添加Sealed修饰符,就不允许创建该类的子类。

修饰方法的话 该方法就不能被重写。

密封类情形:

1:如果库、类或自己编写的其他类的操作中,类或方法是内部的,重写它的功能会导致代码不稳定,最好标记为Sealed:

2:对于密封类,编译器知道不能派生类,因此用于虚拟方法的虚拟表可以缩短或消除,以提高性能。

也就是说,类型有一个虚拟表?来记录/维护虚拟的方法或者类?

方法声明为Sealed,方法可以是基类的重写方法。但是接下来继承的另一个类就不能在扩展这个方法的虚拟表了。在sealed的方法中结束了。

public/protected/private是逻辑访问修饰符,internal是一个物理访问修饰符 边界是一个程序集。

类型定义可以是内部或公有的,不能把类型定义为protected、private、private protected 或protected internal,这些修饰符只能引用于成员。但是可以修饰嵌套类型。

类如果没有写public 则默认的是Internal。

public class MyClass
{
    protected class InnerClass
    {
        .....        
    }    
    //etc    ...

}

 接口: 接口成员 总是隐式为public

as和is运算符:

as -返回对象的引用。如果不是所要求的类型 这个运算符就返回null ,所以使用as之后最好验证一下是否为空。

is:根据条件是否满足,对象是否使用指定的类型。返回true和false.如果为true就可以进行类型转换。

 

重载:

重载方法被调用时,更具体的类型拥有更高的优先级

调用哪个重载方法在编译时就已经确定下来了

如  

public void Foo(A a){}

public void Foo(B b){}

A a=new A();
Foo(a);  //calls Foo(A a)


B b=new A();
Foo(b)   //calls Foo(B b)

 

转载于:https://www.cnblogs.com/SignX/p/10991006.html

### C# 面向对象编程核心概念 #### 继承 继承是面向对象编程的一个重要特性,允许一个类从另一个类获取属性和行为。在C#中,通过`:`关键字指定基类来实现单继承。 ```csharp public class Animal { public virtual void MakeSound() { Console.WriteLine("Some generic animal sound"); } } public class Dog : Animal { public override void MakeSound() // 覆盖父类方法 { Console.WriteLine("Bark!"); } } ``` 上述代码展示了如何定义一个名为 `Animal` 的基类以及它的派生类 `Dog`[^1]。 #### 封装 封装指的是将数据成员(字段)及其操作(方法)组合成单一单元——即类,并对外部世界隐藏内部细节的过程。访问修饰符用于控制对这些组件的访问权限。 ```csharp public class Person { private string name; public string Name { get { return name; } set { name = value; } } public void IntroduceYourself() { Console.WriteLine($"Hi, my name is {name}"); } } ``` 这里展示了一个简单的例子,在其中实现了私有字段 `name` 和相应的公共属性 `Name` 来保护其值不被外部直接修改[^3]。 #### 多态 多态性是指同一实体能够表现出多种形态的能力;具体到程序设计领域,则意味着相同的接口可以有不同的实现形式。C# 支持两种类型的多态: - **运行时/动态多态**:主要依赖于虚方法(`virtual`)、抽象方法(`abstract`) 或者覆写 (`override`) 关键字完成。 ```csharp var animals = new List<Animal> {new Cat(), new Dog()}; foreach (var animal in animals) animal.MakeSound(); ``` - **编译时/静态多态**:涉及方法重载(Method Overloading),它发生在同一个作用域内存在同名但签名不同的多个函数的情况下。 ```csharp public class Calculator { public int Add(int a, int b) => a + b; public double Add(double a, double b) => a + b; } ``` 以上片段说明了如何利用多态性的两个方面来编写灵活而可扩展的应用逻辑[^4]。 #### 抽象 抽象化帮助我们关注事物的本质特征而不是具体的实例。在C#里,可以通过声明抽象类或接口达到此目的。它们都不能被实例化,只作为其他类的基础模板使用。 ```csharp public abstract class Shape { protected Color color; public abstract float Area(); public void PrintColorInfo() { Console.WriteLine($"This shape's color is {color}."); } } // 定义圆形类并实现面积计算功能 public class Circle : Shape { private readonly float radius; public Circle(float r, Color c) { this.radius = r; this.color = c; } public override float Area() { return Math.PI * radius * radius; } } ``` 这段代码描述了一种基于形状的概念模型,其中包含了通用的行为模式(比如打印颜色信息),同时也强制任何实际的对象都必须提供特定的功能实现(如求解面积)。这种方式有助于构建更加模块化的应用程序结构[^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值