class Program
{
static void Main(string[] args)
{
contact [] contacts=new contact [2];
contacts[0]=new class1();
contacts[1]=new class2();
class2 c2 = new class2();
class1 c1 = new class1();
contacts[0].A = "1";
Console.WriteLine(c1.A);
foreach(contact ct in contacts)
{
//ct.A = "9";
Console.WriteLine(ct.prinf());
Console.WriteLine(ct.A);
Console.WriteLine(c2.prinf());
}
}
}
abstract public class contact
{
public virtual string prinf()
{
return ("这是虚方法");
}
string a="0";
public virtual string A
{
get { return a; }
set { a = value; }
}
}
public class class1 : contact
{
public override string prinf()
{
return ("这是新的方法");
}
string a="6";
public string A
{
get { return a; }
set { a = value; }
}
}
public class class2 : contact
{
public new string prinf()
{
return ("这是另一个新的方法");
}
}
显示:
6
这是新的方法
1
这是另一个新的方法
这是虚方法 // 这里没有重载prinf();
0
这是另一个新的方法。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
问题2:
后来看书,多态性。
Animal myanimal=mycow();相当于是把某基本类型的变量赋予其派生类变量(这句话真绕,我的理解是派生类=》给基类)而myanimal调用基类方法相当于从派生类中调用这个方法,但他不能调用只在派生类中定义的方法。我的理解是,即使把派生类的变量给了基类变量,但是归根到底myanimal是基类变量,所以不能用只在派生类中才有的东西。如果要用需要类型转换。
对于上面代码。contacts[1]是基类即使给了new class2,也不能调用他的prinf。
而对于class1中的属性A,似乎也是new的了。
contacts[0].A相当于重载基类的A。即如果去掉contacts[0].A = "1";则也会输出contacts[0].A = "0";