public interface Iaa
{
void show();
}
class ba //基类
{
public void show()
{
Console.WriteLine("ba.show");
}
} class de : ba,Iaa //子类
{
new public void show()
{
Console.WriteLine("de.show");
}
}
class Program
{
static void Main(string[] args)
{
b = new de();
b.show(); //为什么显示 ba.show
((Iaa)b).show(); //为什么显示de.show
Console.Read();
}
}
{
void show();
}
class ba //基类
{
public void show()
{
Console.WriteLine("ba.show");
}
} class de : ba,Iaa //子类
{
new public void show()
{
Console.WriteLine("de.show");
}
}
class Program
{
static void Main(string[] args)
{
b = new de();
b.show(); //为什么显示 ba.show
((Iaa)b).show(); //为什么显示de.show
Console.Read();
}
}
b.show(); //为什么显示 ba.show 因为de的show是new的,而不是override,所以用ba类型变量(尽管实际上是de类型),调用show,就会调用ba的show
((Iaa)b).show(); //为什么显示de.show de是iaa的实现,而ba不是,所以Iaa类型变量调用的是de实现的show
{
void show();
}
class ba //基类
{
public void show()
{
Console.WriteLine("ba.show");
}
} class de : ba,Iaa //子类
{
new public void show()
{
Console.WriteLine("de.show");
}
}
class Program
{
static void Main(string[] args)
{
ba b = new ba();
b = new de();
b.show(); //为什么显示 ba.show
((Iaa)b).show(); //为什么显示de.show
Console.Read();
}
}
如果指定为de b = new de(); 则调用de.show()结果就是de.show
如果指定为da b = new de(); 则调用基类da.show()结果就是da.show
((Iaa)b).show() 只调用实现接口的类(de)中的show() 结果就是 de.show
如果对vritual方法在子类中用override重写,则不论你定义的变量是哪个父类,调用的都是最后override过的实现。
b = new de();
b.show(); //为什么显示 ba.show
不理解为什么会显示ba.show
盼高手~~~~~~~~~~~~~~~~`
{
void show();
}
class ba //基类
{
public void show()
{
Console.WriteLine("ba.show");
}
} class de : ba,Iaa //子类
{
new public void show()
{
Console.WriteLine("de.show");
}
}
class Program
{
static void Main(string[] args)
{
b = new de();
b.show(); //为什么显示 ba.show
((Iaa)b).show(); //为什么显示de.show
Console.Read();
}
}
class de : ba,Iaa //子类
本来这样写是不能编译通过的,应为de中没有实现接口Iaa的Show()方法
但是这里恰好由于de还继承了ba,而ba中恰好有Show()的函数
名字和需要实现接口的方法相同(好多巧合哦-_-"但是巧合后面隐藏着必然吗)这里其实做了这样的操作让基类ba的Show()作为了接口Iaa的Show()的实现
也就是说当我们采用基类的引用或者接口的引用那么指向的函数都是ba.Show()函数
因此:
((Iaa)b).show(); //为什么显示de.show--------所以显示ba.show但是这里又由于使用new关键字,所有当我们使用de的引用去访问Show()函数的时候
函数指向的不再是基类中ba的方法了,而是自己new的方法Show()
因此:
b.show(); //为什么显示 ba.show -----------所以显示de.show太多的巧合了!
-------------------------------------不知道对不对,只是分析没有执行-- -_-" -
执行结果是
de.show
de.show我理解错了
===========================================================================
class de : ba,Iaa //子类
本来这样写是不能编译通过的,应为de中没有实现接口Iaa的Show()方法
但是这里恰好由于de还继承了ba,而ba中恰好有Show()的函数
名字和需要实现接口的方法相同
============================================================================
这样编译也不会出错
class de : Iaa //子类
{
new public void show()
{
Console.WriteLine("de.show");
}
}===========================================================================
这里其实做了这样的操作让基类ba的Show()作为了接口Iaa的Show()的实现
也就是说当我们采用基类的引用或者接口的引用那么指向的函数都是ba.Show()函数
因此:
((Iaa)b).show(); //为什么显示de.show--------所以显示ba.show
===========================================================================最终还是把de中的new public Show()作为接口实现
b = new de();
这句话有问题
de b = new de();----------------显示de.show
da b = new de();----------------显示ba.show总结:
关键在于
1.什么引用去"调用"方法
2.什么作为了接口的实现
为什么?
为什么?
((Iaa)b).show(); // 调用自己de.show如果
ba b = new de(); //b 仍为基类
b.show(); //调用 基类的 ba.show
((de)b).show(); //才会调用de.show
b的实际类型de继承自Iaa接口,在编译时实现了转换,所以运行时b就是de类型
为什么?我这样理解:1.方法是属于类的
2.对象是通过类去访问方法的
3.每个类中存在一张所有方法的引用表+父类的virtual,abstract方法引用表
4.如果在自己的方法表中没有找到方法引用,那么会去到父类中去寻找
5.new的关键字会再子类方法表中创建一个新方法
6.override的关键字会改写父类virtual,abstract方法表使其指向子类中的方法(即使采用父类访问也访问到子类中override的方法)
7.父类对象的引用是可以指向子类对象的,但采用的是父类的方法表ba b = new de();
我们使用的方法表是ba的方法表,那么找到的方法就是ba中的方法ba.show
同样:
如果ba中virtual show,de中new show() --------------------- ba.show()
如果ba中virtual show,de中override show() -----------------de.show()
如果ba中show,de中new show() ------------------------------ba.show()(我们这种情况)
如果ba中show,de中override show() -------------------------编译不通过-------------------------------------------思维混乱中,高手指正--------- -_-" ----
接口那个必然会调用实现该接口的类的show方法。
de的show方法override
这时是调用的show方法是动态的 是运行时类型的方法