用c#时间不短了,以为基础知识都熟悉了,对设计到具体细节时,就模棱两可的。惭愧!
一、重载
在写个简单的实例,加以巩固。有这样一题:代码如下,编译会出错吗,为什么
class Program
{
public static int add(int a, int b) { return a + b; }
public static double add(int a, int b) { return a + b; }
publcvoid Main(string[] args)
{
add(1, 2);
}
}
1.重载:方法名相同,但参数列表不同(参数类型,参数个数)。返回值不同构不成重载。所以报错了。
2.Main这种入口一般都为静态的。会提示:不包含适用与入口的静态Main。
二、重写override:改写父类的方法。
代码如下:输出什么?
public class ClassA
{
public virtual void Write()
{
Console.WriteLine("ClassA");
}
}
public class ClassB : ClassA
{
public override void Write()
{
Console.WriteLine("ClassB");
}
}
class Program
{
static void Main(string[] args)
{
ClassB b = new ClassB();
b.Write();
ClassA a1 = new ClassA();
a1.Write();
ClassA a2 = b;
a2.Write();
Console.ReadKey();
}
}
输出:ClassBClassAClassB。在发生继承时,父类和子类的方法都会调用ClassB。发生继承,就是创建的还是ClassB的实例,会把ClassB的实例转成ClassA。
直接创建的ClassA是没有发生继承的,没有发生重写。所以直接创建的ClassA的实例,调用的是ClassA的方法。
三、隐藏new。隐藏父类的方法,但不改变父类的方法
代码如下:输出什么?
public class ClassA
{
public void Write()
{
Console.WriteLine("ClassA");
}
}
public class ClassB : ClassA
{
public new void Write()
{
Console.WriteLine("ClassB");
}
}
class Program
{
static void Main(string[] args)
{
ClassB b = new ClassB();
b.Write();
ClassA a1 = new ClassA();
a1.Write();
ClassA a2 = b;
a2.Write();
Console.ReadKey();
}
}
输出:ClassBClassAClassA。隐藏的时候,ClassA、ClassB的实例就是调用自己的方法。ClassB不设计ClassA的修改。
浙公网安备 33010602011771号