interface Iname
{
void GetName();
}
public class a:Iname
{
public virtual void GetName()
{
Console.WriteLine("this is a");
}
}
public class b:a
{
public override void GetName()
{
Console.WriteLine("this is b");
}
}
请问我这样写算是实现接口了么?

解决方案 »

  1.   

    当然算是。
    a实现了接口中定义的方法,b继承了a并且重载了这个方法。
      

  2.   

    算,你可以检验一下 Iname n = new b(); n.GetName(); 输出this is b就对了
      

  3.   

    算interface Iname
    {
        void GetName();
    }
    public class a : Iname
    {
        public virtual void GetName()
        {
            Console.WriteLine("this is a");
        }
    }
    public class b : a
    {
        public override void GetName()
        {
            Console.WriteLine("this is b");
        }
    }public class Test
    {    public static void Main()
        {
            Iname i1 = new a();
            i1.GetName();
            Iname i2 = new b();
            i2.GetName();
        }
    }
      

  4.   

    也可以使用显示实现,没必要生搬硬套理论。只要开发的时候顺手方便即可.不过还是有点区别
    interface Iname
        {
            void GetName();
        }
    public class a:Iname
        {
            void Iname.GetName()
            {
                Console.WriteLine("this is a");
            }
            public virtual void GetName()
            {
                Iname n = this;
                n.GetName();
            }
        }
    public class b:a
        {
            public override void GetName()
            {
                Console.WriteLine("this is b");
            }
        }
    Iname n = new b();
    n.GetName();                  //this is a
    //如果改成
    public class b:a, Iname
        {
            public override void GetName()
            {
                Console.WriteLine("this is b");
            }
        }
    Iname n = new b();
    n.GetName();                  //this is b
      

  5.   

    又糊涂了,7楼的2个不同的输出区别在什么地方呢? 
    既然第一种情况下b已经实现接口了,
    那public class b:a, Iname和public class b:a又有什么不同呢?
      

  6.   

    还有一个疑问
    7楼的代码中 class a中的2个方法
    void Iname.GetName()  和  public virtual void GetName()
    是什么关系呢??
      

  7.   

    第一种写法下因为a显示实现了接口,所以b就无法在实现接口了,所以让想b能继续实现就让b:a,Iname
      

  8.   

    那也就是说第一种写法b没有实现接口喽? 那为什么可以Iname n = new b();  呢???
      

  9.   

    因为a继承了Iname所以可以写 Iname n = new b(); 
    interface Iname
        {
            void GetName();
        }
    public class a:Iname
        {
            public void GetName()
            {
                Iname n = this;
                n.GetName();Console.WriteLine("this is a");
            }
        }
    public class b:a
        {
            public void GetName()
            {
                Console.WriteLine("this is b");
            }
        }
    Iname n = new b();
    n.GetName();                  //this is a
    //如果改成
    public class b:a, Iname
        {
            public override void GetName()
            {
                Console.WriteLine("this is b");
            }
        }
    Iname n = new b();
    n.GetName();                  //this is b是我对现实,隐式实现的解释误导了你。应该这么说a实现了Iname的接口以后如果GetName不使用virtual修饰,那么b的GetName()是不会被调用了,如果想被调用要么a使用virtual修饰,要么b再继承Iname接口
      

  10.   

    //如果改成里面没有override不好意思写错了
    public class b:a, Iname
        {
            public void GetName()
            {
                Console.WriteLine("this is b");
            }
        }
    Iname n = new b();
    n.GetName();                  //this is b显示实现接口实际上是为了封装性,比如你的接口Iname是在一个业务处理dll里并且不是public的,a是在另一个dll里比如在UI项目里,如果你在a里面显示实现GetName方法目的就是为了不想让UI项目里的其他类调用,而只有把a对象传回到业务处理的dll中时才能被使用
      

  11.   

    说一个比较实际点例子,在开发web,winform共同存在且业务相关的项目时,业务逻辑的代码可能是web,winform两个项目公用的,这就涉及到一个问题,session,因为业务逻辑层可能要取session里面的值比如用户信息进行操作。这是为了统一web和winfrom的开发就可以定义一个ISession接口
    interface ISession
    {
        object GetValue(string name);
    }
    然后WebSession和WinSession对它分别进行显示实现,这样可以组织UI层直接使用Session数据造成混乱。