VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3198|回复: 19

小女子初学对象时的小问题~~~!!!

[复制链接]

1

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-1-26 12:00:02 | 显示全部楼层 |阅读模式
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();
        }
    }
回复

使用道具 举报

0

主题

9

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
发表于 2020-2-16 20:45:01 | 显示全部楼层
b = new de();   这个b会有两个实际的show
b.show(); //为什么显示 ba.show   因为de的show是new的,而不是override,所以用ba类型变量(尽管实际上是de类型),调用show,就会调用ba的show
((Iaa)b).show(); //为什么显示de.show  de是iaa的实现,而ba不是,所以Iaa类型变量调用的是de实现的show
回复

使用道具 举报

0

主题

27

帖子

21.00

积分

新手上路

Rank: 1

积分
21.00
发表于 2020-2-17 20:15:01 | 显示全部楼层
请问b是什么类型,你这里没有定义呀。定义成ba b 和 de b 是不一样了。
回复

使用道具 举报

0

主题

5

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-2-18 09:15:01 | 显示全部楼层
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)
        {
            ba b = new ba();
            b = new de();
            b.show();   //为什么显示 ba.show
            ((Iaa)b).show(); //为什么显示de.show
            Console.Read();
        }
    }
回复

使用道具 举报

0

主题

5

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-2-18 10:45:01 | 显示全部楼层
在Main方法中 b=new de();要指定b的类型.
如果指定为de b = new de(); 则调用de.show()结果就是de.show
如果指定为da b = new de(); 则调用基类da.show()结果就是da.show
((Iaa)b).show() 只调用实现接口的类(de)中的show() 结果就是 de.show

回复

使用道具 举报

0

主题

5

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-2-18 12:15:01 | 显示全部楼层
new 和override 后 有什么区别?
回复

使用道具 举报

0

主题

9

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
发表于 2020-2-19 15:30:01 | 显示全部楼层
ba.show没有用virtual修饰,在子类de中则只能用new,不能用override,不用new运行效果一样,只是编译时会有警告。
如果对vritual方法在子类中用override重写,则不论你定义的变量是哪个父类,调用的都是最后override过的实现。
回复

使用道具 举报

0

主题

5

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-2-19 18:45:01 | 显示全部楼层
ba b = new ba();
            b = new de();
            b.show();   //为什么显示 ba.show
不理解为什么会显示ba.show


盼高手~~~~~~~~~~~~~~~~`
回复

使用道具 举报

0

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-2-22 18:45:01 | 显示全部楼层
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();
        }
    }


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

太多的巧合了!


-------------------------------------不知道对不对,只是分析没有执行-- -_-" -
回复

使用道具 举报

0

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-2-23 16:30:01 | 显示全部楼层
FT!
执行结果是
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()作为接口实现
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表