直接上代码吧    interface Sample1
    {
        void say();
    }
    interface Sample2
    {
        void say();
    }
    interface Sample3 : Sample1, Sample2
    {
        void func3();
    }    class B : Sample3
    {    }以上接口Sample3继承自接口Sample1,Sample2
而Sample1,Sample2中有同名的方法say()
则在实现Sample3的类B中应该怎么样才能区别Sample1,Sample2?
或者直接能在Sample3的定义中区别么?

解决方案 »

  1.   

    本帖最后由 caozhy 于 2011-04-09 13:59:42 编辑
      

  2.   

    通过接口名称来区分啊   interface Sample1
        {
            void say();
        }
        interface Sample2
        {
            void say();
        }
        interface Sample3 : Sample1, Sample2
        {
            void func3();
        }    class B : Sample3
        {
             void Sample1.say()
             {
                  Console.WriteLine("接口1中的方法");
             }         void Sample2.say()
             {
                   Console.WriteLine("接口2中的方法");
             }          public void func3()
             {
                  Console.WriteLine("接口3中的方法");
             }
        }
      

  3.   

    这里需要注意的一点,如果多个接口中有同名的方法的话,那么在具体的子类实现过程中同名的方法需要加上接口名称来区分,且不要用public来修饰,非同名的方法必须用public修饰。
      

  4.   

    果然是C#的人多啊  在python区问一个问题  至少半天才会有一个人回帖~~~~
      

  5.   

    正确。
    修正下我的代码:
        interface Sample1
        {
            void say();
        }
        interface Sample2
        {
            void say();
        }
        interface Sample3 : Sample1, Sample2
        {
            void func3();
        }
        class B : Sample3
        {
            void Sample1.say() { Console.WriteLine("Sample1.say()"); }
            void Sample2.say() { Console.WriteLine("Sample2.say()"); }
            public void func3() {  }
        }
      

  6.   


    还有个问题就是,如果我想
    Sample3 s3 = new B();
    而直接 s3.say()显然是不行的那如果再Sample3的接口定义中区分不同的继承的呢?
      

  7.   


    public void Test()
    {
        Entity e = new Entity();
        Sample1 s1 = e as Sample1;
        Sample2 s2 = e as Sample2;
        s1.say();
        s2.say();
        e.func3();
    }interface Sample1
    {
        void say();
    }
    interface Sample2
    {
        void say();
    }
    interface Sample3 : Sample1, Sample2
    {
        void func3();
    }class Entity : Sample3
    {
        public void func3()
        {
            Console.WriteLine("fun3");
        }    public void say()
        {
            Console.WriteLine("say");
        }
    }
    接口关键是描述行为和属性。比如你有2个接口:
    interface IFlyable
    {
        void GetReady();
        void Fly();
    }interface ITravelable
    {
        void GetReady();
        void Run
    }都具有做好准备的方法,那么,按照面向对象的设计,你是可以忽略细节,直接调用GetReady的,当然,如果你为了区分Fly的准备和Travel的准备,可以将2个接口显示实现。MSDN上写不推荐显示实现接口,因为其子类无法继承这个接口的实现。或许,你可以将类这样设计:public void Test()
    {
        Entity e = new Entity(new Entity1(), new Entity2());
        e.S1.say();
        e.S2.say();
        e.func3();
    }interface Sample1
    {
        void say();
    }
    interface Sample2
    {
        void say();
    }interface Sample3
    {
        void func3();
    }public class Entity1 : Sample1
    {
        public void say() { Console.WriteLine("sample1.say");}
    }public class Entity2 : Sample2
    {
        public void say() { Console.WriteLine("sample1.say"); }
    }class Entity : Sample3
    {    public Sample1 S1;
        public Sample2 S2;    public Entity(Sample1 s1,Sample2 s2)
        {
            this.S1 =s1;
            this.S2 = s2;
        }    public void func3()
        {
            Console.WriteLine("fun3");
        }
    }
      

  8.   

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Sample3 b = new B();
                b.say();
            }
        }
        interface Sample1
        {
            void say();
        }
        interface Sample2
        {
            void say();
        }
        interface Sample3 : Sample1, Sample2
        {
            void say();
            void func3();
        }
        class B : Sample3
        {
            void Sample1.say() { Console.WriteLine("Sample1.say()"); }
            void Sample2.say() { Console.WriteLine("Sample2.say()"); }
            public void say() { Console.WriteLine("say()"); }
            public void func3() { }
        }
    }
    要么在 Sample3 里面定义 say(),这样这个 say() 会隐藏 Sample1 Sample2 里面的 say()要么显式将一个 Sample3 类型转换成 Sample1 或者 Sample2:
    Sample3 b = new B();
    Sample1 b1 = b as Sample1;
    b1.say();