C#经典面向对象测试题
根据给定的C#代码示例,我们可以从中提取并总结出一些重要的面向对象编程概念以及相关的C#语言特性。下面将逐一分析每个代码片段,并解释其中涉及的关键知识点。 ### 代码片段1 #### 代码概览 ```csharp class Program { static void Main(string[] args) { B b = new B(); b.PrintFields(); Console.ReadKey(); } } class A { public A() { PrintFields(); } public virtual void PrintFields() { } } class B : A { int x = 1; int y; public B() { y = -1; } public override void PrintFields() { Console.WriteLine("x={0},y={1}", x, y); } } ``` #### 关键知识点 - **类继承**:`B`类继承自`A`类。这体现了C#中的单继承机制。 - **构造函数与初始化器**:`B`类的构造函数初始化了成员变量`y`。这是C#中初始化器的一个应用实例。 - **虚方法与重写**:`PrintFields`在基类`A`中被声明为虚方法,在派生类`B`中被重写。这展示了多态性的一个关键方面,即派生类可以提供其父类行为的新实现。 - **实例方法调用**:通过实例化`B`类并调用其`PrintFields`方法来展示派生类的行为。 ### 代码片段2 #### 代码概览 ```csharp public class A { public virtual void Fun1(int i) { Console.WriteLine(i); } public void Fun2(A a) { a.Fun1(1); Fun1(5); } } public class B : A { public override void Fun1(int i) { base.Fun1(i + 1); } public static void Main() { B b = new B(); A a = new A(); a.Fun2(b); b.Fun2(a); Console.ReadKey(); } } ``` #### 关键知识点 - **多态性**:通过`Fun2`方法,可以看到如何调用不同类型的对象的方法。当`a.Fun2(b)`时,由于`b`是`B`类型,因此会调用`B`类中的`Fun1`方法。同样地,`b.Fun2(a)`会调用`A`类中的`Fun1`方法。这展示了多态性的实际应用。 - **虚方法与重写**:`Fun1`方法在`A`类中声明为虚方法,并在`B`类中被重写。这再次强调了多态性和动态绑定的概念。 ### 代码片段3 #### 代码概览 ```csharp public class A { public virtual void Fun1(int i) { Console.WriteLine(i); } public void Fun2(A a) { a.Fun1(1); Fun1(5); } } public class B : A { public override void Fun1(int i) { base.Fun1(i + 1); } public static void Main() { B b = new B(); A a = new A(); a.Fun2(b); b.Fun2(a); Console.ReadKey(); } } ``` #### 关键知识点 该代码片段与片段2几乎相同,因此涉及到的知识点也相似,主要展示了多态性、虚方法与重写等概念。 ### 代码片段4 #### 代码概览 ```csharp public abstract class A { public A() { Console.WriteLine('A'); } public virtual void Fun() { Console.WriteLine("A.Fun()"); } } public class B : A { public B() { Console.WriteLine('B'); } public new void Fun() { Console.WriteLine("B.Fun()"); } public static void Main() { A a = new B(); a.Fun(); Console.ReadKey(); } } ``` #### 关键知识点 - **抽象类与抽象方法**:`A`类被声明为抽象类,并包含了一个构造函数和一个虚方法`Fun`。这展示了抽象类作为基类的用途,以及如何通过派生类来实现具体逻辑。 - **隐藏与重写**:`B`类中的`Fun`方法使用`new`关键字隐藏了基类中的同名方法。这与重写有所不同,因为隐藏不会改变多态行为。 ### 代码片段5 #### 代码概览 ```csharp public class Program { static void Main(string[] args) { A a = new C(); a.Show(); Console.ReadKey(); } } public class A { public virtual void Show() { Console.WriteLine("A"); } } public class B : A { public new virtual void Show() { Console.WriteLine("B"); } } public class C : B { public override void Show() { Console.WriteLine("C"); } } ``` #### 关键知识点 - **多层继承**:该示例展示了多层继承的结构,`C`类继承自`B`类,而`B`类又继承自`A`类。 - **多态性**:通过`A`类型的引用指向`C`类的实例,并调用`Show`方法,这演示了多态性的工作原理。最终输出的是`C`类中重写后的`Show`方法的内容。 ### 代码片段6 #### 代码概览 ```csharp class Program { static void Main(string[] args) { string b; b = "old"; Func1(ref b); Console.WriteLine(b); int c; c = 3; Func1(ref c); Console.WriteLine(c); } public static void Func1(ref string a) { a = "new"; } public static void Func1(ref int a) { a = 6; } } ``` #### 关键知识点 - **引用参数**:通过使用`ref`关键字传递参数到方法中,可以直接修改原始值。这展示了C#中引用参数的使用方式。 - **方法重载**:`Func1`方法有两组不同的参数列表,分别处理字符串和整数。这展示了方法重载的用法。 ### 代码片段7 #### 代码概览 ```csharp class Program { static void Main(string[] args) { string b; b = "old"; Func1(b); Console.WriteLine(b); int c; c = 3; Func1(c); Console.WriteLine(c); } public static void Func1(string a) { a = "new"; } public static void Func1(int a) { a = 6; } } ``` #### 关键知识点 该代码片段与片段6类似,但没有使用`ref`关键字。因此,涉及的知识点主要是方法重载,以及值类型和引用类型之间的区别。 ### 代码片段8 #### 代码概览 ```csharp public class A { private void printA() { Console.WriteLine("printA"); } private virtual valueA() } ``` #### 关键知识点 这个代码片段不完整,但是可以看出: - **私有方法**:`printA`方法被声明为私有,这意味着它只能在`A`类内部被访问。 - **虚拟方法声明错误**:`valueA`方法声明有误,缺少方法体或返回类型。这可能是指出了面向对象编程中一个常见的错误——在声明虚方法时忘记提供完整的声明。 以上就是对给定代码片段中涉及的C#面向对象编程关键知识点的总结。这些示例不仅展示了C#语言的基本特性,还深入探讨了面向对象编程的核心概念,如继承、多态性、构造函数、虚方法与重写等。
class Program
{
static void Main(string[] args)
{
B _b = new B();
_b.PrintFields();
Console.ReadKey();
}
}
class A
{
public A()
{
PrintFields();
}
public virtual void PrintFields() { }
}
class B : A
{
int x = 1;
int y;
public B()
{
y = -1;
}
public override void PrintFields()
{
Console.WriteLine("x={0},y={1}", x, y);
}
2:
public class A
{
public virtual void Fun1(int i)
{
Console.WriteLine(i);
}
public void Fun2(A a)
{
a.Fun1(1);
Fun1(5);
}
}
public class B : A
{
public override void Fun1(int i)
{
base.Fun1(i + 1);
}
public static void Main()
{
B b = new B();
剩余11页未读,继续阅读
- 粉丝: 7
- 资源: 29
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助