首页 新闻 会员 周边 捐助

求教基础的问题

0
悬赏园豆:5 [已解决问题] 解决于 2012-04-16 10:49
我在阅读 Is(), Fluent Condition Checker Library (http://islib.codeplex.com/SourceControl/changeset/view/65858#1126092)的时候发现这样的代码:
1 public interface IIs<TTarget> {}
2 public abstract class IsBase<T, TTarget> : IIs<TTarget> where T : IsBase<T, TTarget> {}
3 public sealed class Is<TTarget> : IsBase<Is<TTarget>, TTarget> {}

 

类 class Is<TTarget> : IsBase<Is<TTarget>, TTarget> 为什么会如此继承?这样做的好处是什么?


loneys的主页 loneys | 初学一级 | 园豆:23
提问于:2012-04-15 12:26
< >
分享
最佳答案
0

你问的这个开源项目我没有看过,但是从你贴出的3个定义来看,作者很有可能是为了实现链式编程。你可以去看看这3个定义在哪里使用过来验证一下。下面是我简化过的例子,来说明这样有什么好处。

    interface IVehicle
    {
        string Name { get; }
        string Color { get; }
    }

    abstract class Vehicle<TSelf> : IVehicle where TSelf : Vehicle<TSelf>
    {
        private string m_name, m_color;

        public TSelf Name(string name)
        {
            m_name = name;
            return (TSelf)this;
        }

        public TSelf Color(string color)
        {
            m_color = color;
            return (TSelf)this;
        }

        string IVehicle.Name
        {
            get { return m_name; }
        }

        string IVehicle.Color
        {
            get { return m_color; }
        }
    }

    class Car : Vehicle<Car>
    {
        //car 没什么特殊的方法
    }

    class Tractor<TGoods> : Vehicle<Tractor<TGoods>>
    {
        public Tractor<TGoods> Load(TGoods goods)
        {
            //load the goods
            return this;
        }
    }

用法:

var tractor = new Tractor<object>();
tractor.Color("red").Name("我的车").Load("随便一个货物").Name("顺序无所谓的").Color("再刷层漆盖掉");

var car = new Car();
car.Name("小车").Color("green"); 
收获园豆:5
水牛刀刀 | 大侠五级 |园豆:6350 | 2012-04-16 10:31

Thank you

loneys | 园豆:23 (初学一级) | 2012-04-16 10:49
其他回答(1)
0

泛型類。泛型接口。你可以查一下,泛型的特點

無限遐想 | 园豆:3740 (老鸟四级) | 2012-04-15 13:03

你想说什么?

支持(0) 反对(0) loneys | 园豆:23 (初学一级) | 2012-04-15 22:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册