//当要解决许多包含同样成员的接口时,显示接口实现非常有用。例如:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace interfaceAgain
{
    public abstract class Shape
    {
        protected string name;
 
        public Shape()
        {
            name = "noName";
        }
 
        public Shape(string name)
        {
            this.name = name;
        }
 
        public abstract void Draw();
 
        public string Name
        { 
            get { return name; }
            set { name = value; }
        }
    }
 
    public interface IDraw
    {
        void Draw();
    }
 
    public interface IDraw3D
    {
        void Draw();
    }
 
    public interface IDrawToPrinter
    {
        void Draw();
    }
 
    public class Line : Shape, IDraw, IDraw3D, IDrawToPrinter
    {
        public Line() { }
        public Line(string name)
            : base(name)
        { 
            
        }
 
        public override void Draw()
        {
            Console.WriteLine("Drawing {0} Line!",name);
        }
 
        //显示接口实现时注意,首先的是不能在定义显示实现成员时加访问修饰符
 
        //下面这个是错误的
        //public void IDraw.Draw() <=错误!
        //{
        //    Console.WriteLine("Drawing in normal!");
        //}
        //这是有道理的。使用显示接口实现是为了保证一个指定接口方法被限定在接口级别。如果要添加public关键字,则说明该方法是类公共部分的一个成员,
        //这就与前面所说的不相吻合了!基于这种设计,调用方仅能在对象级别调用由Shape基类定义的Draw()方法了。
        void IDraw.Draw()
        {
            Console.WriteLine("Drawing in normal!");
        }
 
        void IDraw3D.Draw()
        {
            Console.WriteLine("Drawing in 3D!");
        }
 
        void IDrawToPrinter.Draw()
        {
            Console.WriteLine("Printer this Line!");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //调用Draw()
            Line lineTest = new Line("Black");
            lineTest.Draw();
 
            //要调用由IDraw()定义的Draw()方法时,必须使用前面提到的其他技术显示获取接口引用,例如:
            //将触发IDraw.Draw()方法
            IDraw lineTemp = (IDraw)lineTest;
            lineTemp.Draw();
 
            //将触发IDraw3D()定义的Draw()方法
            IDraw3D lineTemp1 = (IDraw3D)lineTest;
            lineTemp1.Draw();
 
            //将触发IDrawToPrinter()定义的Draw()方法
            IDrawToPrinter lineTemp2 = (IDrawToPrinter)lineTest;
            lineTemp2.Draw();
 
            Console.ReadKey();
        }
    }
}