C#,接口的实现 - Angel's Blog.

ing
 
 
软件开发,程序设计,前端设计
 
 
首页 > code > C#,接口的实现

C#,接口的实现

 

1)接口:

⑴:用接口实现list对象的排序:

先给一个有bug的demo(控制台程序):

demo:

 

    public class DemoICompare
    {
        public DemoICompare() { }
        public DemoICompare(string name, int age, string hobby)
        {
            this.Name = name;
            this.Age = age;
            this.Hobby = hobby;
        }
        private string _Name;
        private int _Age;
        private string _Hobby;

        public string Hobby
        {
            get { return _Hobby; }
            set { _Hobby = value; }
        }

        public int Age
        {
            get { return _Age; }
            set { _Age = value; }
        }

        public string Name
        {
            get { return _Name; }
            set { _Name = value; }
        }
    }

—————DemoICompare类结束————————-

在Program 静态类中打印:

 

    public class Program
    {
        static void Main(string[] args)
        {
            List<DemoICompare> demoICompare = new List<DemoICompare>();
            DemoICompare angel = new DemoICompare("angel" , 23, "34455");
            DemoICompare xiaoli = new DemoICompare("xiaoli" , 21, "android");
            DemoICompare snake = new DemoICompare("snake" , 25, "player");
            demoICompare.Add(angel);
            demoICompare.Add(xiaoli);
            demoICompare.Add(snake);
            demoICompare.Sort();
            foreach (DemoICompare demos in demoICompare)
            {
                Console.WriteLine(demos.Age);
            }
            Console.ReadLine();
        }
    }

demo中如果直接使用list对象的sort方法,会出现错误“必须至少有一个对象要实现接口”

所以,在这里,我们将 类DemoICompare 的接口实现,在这里,vs2008提供了快捷方式“Shift+ Alt + F10”可以快速调用实现接口的选择项目。

接口的语法:

 

        public interface IComparable
        {
            int ComepareTo(Object obj);
        }

 

这个方法是用来比较当前对象与另一对象的大小。

其中,使用CompareTo,会返回一个整型值:

①:返回值小于0,当前对象小于obj。

②:返回值大于0,当前对象大于obj。

③:返回值等于0,当前对象等于obj。

下面来debug demo中的bug:

修改demo中的    public class DemoICompare : IComparable

demo1:

 

    public class DemoICompare : IComparable//接口
        //中间的代码同demo,省略..
        //实现接口
        #region IComparable 成员

        public int CompareTo(object obj)
        {
            if (!(obj is DemoICompare))
            throw new Exception("异常");
            DemoICompare dc = obj as DemoICompare;
            return this.Age.CompareTo(dc.Age);
        }

        #endregion

这样就可以进行数组元素比较实现排序的功能了。
同理,string 类型的CompareTo方法,sort排序同样也可以实现了。
补充:参数obj必须与实现此接口的类型一致,否则会发生异常。

 

⑵:接口是一种标准,使用这个标准就可以实现对应的一些功能,接口的优势就是实现了所谓的多重继承。

①:接口可以包含属性、方法、索引器等,但是都是不能实现。

接口的属性和方法:

 

        //接口的属性
        public interface ISampleInterface
        {
            string Name
            {
                get;
                set;
            }
        }
        //接口的方法
        public interface ISampleInterface
        {
            void NameShow();
        }

②:定义一个接口,命名前以I开头。

③:在类中实现接口,语法和继承相似:class 类名:IComparable

④:如果当前的类已经继承,接口则在继承的父类后用 , 分隔:class 类名:父类 , IComparable

2)泛型接口:

⑴:IComparable<T>的使用:

泛型(集合)的优势在集合中是显而易见的,可以不必考虑转换类型和安全问题。
同样,如果在实现CompareTo()方法,对当前的对象和另一个实例比较的时候,可以考虑使用IComparable<T>,
无须类型转换;IComparable<T>中如果在某个类中实现了,就只能和这个对应类的对象进行比较,这就是
IComparable<T>的约束,从而保证了安全。

demo2:

 

    public class DemoICompare : IComparable<DemoICompare>
    {
        //代码省略...同demo1
        #region IComparable<DemoICompare> 成员

        public int CompareTo(DemoICompare other)
        {
            //throw new NotImplementedException();
            return this.Age.CompareTo(other.Age);
        }

        #endregion
    }

同样也实现了按照年龄的排序。
在这里,实现IComparable<DemoICompare>接口之后,必须向CompareTo()方法传入DemoICompare的对象。

:IComparable<T>比较器的使用:

在之前的demo的类中,使用IComparable、IComparable<T>接口的实现,
其中,在集合对象中添加.sort方法,这个方法其实是默认的排序,
如果想用其他的排序方式,必须自己重新实现CompareTo()。

在这里,需要使用Sort()的重载:

①:Sort()方法的重载:

 

        public void Sort(IComparer<T> comparer)

此重载传入IComparer<T>泛型接口,也是传说中的“比较器”,传入什么类型的比较器,Sort()可以实现不同的比较。

②:IComparer<T>泛型接口:

IComparer<T>泛型接口有一个没有实现的方法 int Compare(T x , T y),用来比较两个对象的大小。

先按照指定的比较方式,然后传入Sort(),实现了想要指定的排序方式。
同样地,它有一个整型的返回值,返回值的具体如下:

如果返回值大于0,x > y;

如果返回值小于0,x < y;

如果返回值等于0,x = y; 

demo3:

 

   public class SortBy
    {
        private string _Name;
        private int _Age;
        private string _Hobby;
        public SortBy() { }
        public SortBy(string name, int age, string hobby)
        {
            this.Name = name;
            this.Age = age;
            this.Hobby = hobby;
        }

        public string Hobby
        {
            get { return _Hobby; }
            set { _Hobby = value; }
        }

        public int Age
        {
            get { return _Age; }
            set { _Age = value; }
        }

        public string Name
        {
            get { return _Name; }
            set { _Name = value; }
        }
    }
    public class NameSort:IComparer<SortBy>
    {

        #region IComparer<SortBy> 成员

        public int Compare(SortBy x, SortBy y)
        {
            //throw new NotImplementedException();
            return (x.Name.CompareTo(y.Name));//按照字母顺序比较
        }

        #endregion
    }
    public class NameDesc : IComparer<SortBy>
    {

        #region IComparer<SortBy> 成员

        public int Compare(SortBy x, SortBy y)
        {
            //throw new NotImplementedException();
            return (y.Name.CompareTo(x.Name));//按照字母顺序倒序比较
        }

        #endregion
    }

————————SortBy类结束————————–

使用windowsForm的listView显示各种排序Sort()方法,利用接口实现各种排序。

 

    public partial class WindowSort : Form
    {
        public WindowSort()
        {
            InitializeComponent();
        }
        List<SortBy> sortsby = new List<SortBy>();
        /// <summary>
        /// List增加对象
        /// </summary>
        private void InitSort()
        {
            sortsby.Clear();
            SortBy zhangliu = new SortBy("zhangliu", 18, "none");
            SortBy angel = new SortBy("angel", 21, "34455");
            SortBy lisi = new SortBy("lisi", 25, "sohu");
            sortsby.Add(zhangliu);
            sortsby.Add(angel);
            sortsby.Add(lisi);
        }
        /// <summary>
        /// OutSort()方法,绑定到lvMain控件。
        /// </summary>
        /// <param name="sortsby"></param>
        private void OutSort(List<SortBy> sortsby)
        {
            this.lvMain.Items.Clear();
            foreach (SortBy sbs in sortsby)
            {
                ListViewItem item = new ListViewItem(sbs.Name);
                item.SubItems.AddRange(new string[] { sbs.Age.ToString(), sbs.Name, sbs.Hobby });
                lvMain.Items.Add(item);
            }
        }
        //正常字典字母索引排序调用
        private void btnSort_Click(object sender, EventArgs e)
        {
            InitSort();
            sortsby.Sort(new NameSort());//Sort()方法的重载,先进行排序
            OutSort(sortsby);//然后将其绑定到listView。
        }
        //倒序调用
        private void btnDesc_Click(object sender, EventArgs e)
        {
            InitSort();
            sortsby.Sort(new NameDesc());//Sort()方法的重载
            OutSort(sortsby);
        }

3)接口和抽象类的区别:

 

 

  抽象类 接口
不同点 abstract定义 interface定义
只能继承一个类 可以实现多个接口
不是抽象子类必须实现抽象方法 实现接口的类必须实现所有成员
需要override实现抽象方法 实现接口
相似点 不能实例化
包含没有实现的方法
子类必须实现这个方法

 

或者通过RSS 关注本站的更新 ^ O ^ 。” —  by  转载请注明:来自 Angel's Blog.
本文永久链接: http://www.0ee.com/2010/12/03/c-sharp-to-use-interface.html
 
分类: code标签: , ,
 
  • QQ书签
  • Del.icio.us
  • 百度收藏
  • Google
  • 饭否
  • FriendFeed
 

 
评论 (9) Trackbacks (0)
发表评论 Trackback
 
9 Comments Contributed by Visitors
  1.     vastar 2010年12月7日10:49 1#

    好长啊。。对继承不太会用啊,包括C++里的

  2.     学夫子 2010年12月4日13:48 2#

    C语言里就是全部的因为所以,哈哈

  3.     Mucid 2010年12月5日01:15 3#

    囧,不就是继承么。。。还有虚拟继承呐。。

  4.     Angel 2010年12月5日09:11 4#

    @Mucid
    哈哈,恩,好比一头奶牛有好几个奶牛爸爸一样(哈哈,举例不恰当啦。。)。

  5.     水车 2010年12月7日14:59 5#

    关注一下,飘过吧……

  6.     zigbee 2010年12月8日03:30 6#

    C#目前的发展还不错。关注一下。

  7.     Angel 2010年12月8日03:59 7#

    @vastar
    嘿嘿,多看看,多练,这些都是小case。

  8.     Angel 2010年12月8日04:00 8#

    @水车
    欢迎飘过。

  9.     Angel 2010年12月8日04:01 9#

    @zigbee
    嘿嘿,暂时不对c#有任何的评价 :)

Leave Comments Here...

:) :-D :( :-o 8-O :-? 8) lol :-x :-P oops cry evil twisted wink ? idea :-| arrow mrgreen roll !

(required)

(required)

网址随您("http://"可以省略)

(Ctrl+Enter)

  • 本站不会泄露您的 Email 地址, 敬请放心.
  • 本站已开启缓存, 请不要重复提交评论.
  • 请注意: 带有 《广告(链)、不健康、或者 产品名字》 的评论一律视为spam.
  • 支持常用 HTML 标签调用, 插入 HTML 标签需注意: < == &lt;> == &gt;.
  • 仅当某人针对您的评论做出回应时, 您才会收到由本站发出的邮件通知.
  • 如您希望以相同方式通知某位网友, 请点击  按钮进行回复.
  • 允许在评论中使用如下代码: 
    <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> 
    <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> 
    .
  • 鼠标悬浮到评论中的 @someone 区域即可自动显示 someone 的评论内容.
 
 
  • 正在加载...