如:
有一个接口 public interface IEntityBase
 {
     string Id { set;get;  }
 }在一个类中实现这个接口 public class c1 : IEntityBase
 {
     string Id 
     {
        set
        {
            return "aaaa";
        }
     }
 }下面是在另一个类中调用 要求得到ID的值为 在c1中重写的值也就是 "aaaa"  public class c2
 {
     string GetID() 
     {
        // 如果这样写 IEntityBase i=new c1()
        return i.id;
        // 那么必须知道在哪里实现了 id ,
     }    
 }

解决方案 »

  1.   

    把 接口和C1类编译成DLL在C2中调用
    或把3者置于同一namespace下
      

  2.   

    interface IEntityBase 和class c2 在一个工程项目中,
    c1在另一个工程项目中是不是要用委托啊 .....
      

  3.   


    public class c1 : IEntityBase
            {
                public string Id
                {
                    get
                    {
                        return "aaaa";
                    }
                    set { }
                }
            }
            public interface IEntityBase
            {
                string Id { set; get; }
            }
            public class c2
            {
                public string GetID()
                {
                    IEntityBase i = new c1();
                    return i.Id;
                }
            }
      

  4.   


            // 如果这样写 IEntityBase i=new c1()
            return i.id;
            // 那么必须知道在哪里实现了 id ,也就是说 不知道是在哪个类里实现的 可能是c1,也可能是c2....
    .net框架里有好多这样的类像MembershipProvider类,它是个 abstract类,
    不知道你有没有写过类似继承MembershipProvider类类,比如说我在x1中调用MembershipProvider中的getname()他会根据他的继承类 中重写的内容执行代码,重写类中是 return "1";那么在x1中调用getname()返回的就是1
      

  5.   

    我冤枉啊,我的结果的确是"aaaa"啊
    具体为什么 简单的和你说 你new的是 C1就是 C1的 和引用没关系 只和实例有关
      

  6.   

    哈哈你可能没有明白我的意思
    你看看你的答案和我的为题(最后一段代码)有什么区别啊
    我也知道得那么做。可是C1 怎么就知道是C1 这是一个父类调用子类的也就是说"C1"不是固定的
      

  7.   

    我晕了,难道还没明白?
    不管你是 C几, 你new的是谁 他就是谁。
    接口的声明 只决定你能调用到后面实例 也就是c几的方法也就是说 父类的声明只能调用子类实现父类的方法和属性,而子类添加的属性和方法调不到而已
      

  8.   

    我也晕了
    简单的说就是在调用 IEntityBase 接口下面属性id的时候 不知道 有C1这个类或是 的确有这样一个类可是名字不叫C1
      

  9.   

    怎么可能不知道 ?不知道, IEntityBase的实例是什么 ?
    如果什么都没有是null的 编译都过不去
      

  10.   

    如同CANCERSER所说,你如果不知道子类,是无法实例化这个接口的.
      

  11.   

    如果子类不固定,感觉的确要使用反射了.
    使用反射确定这个类是否继承了IEntityBase
    之后再创建对象.
      

  12.   

    在调用一个虚方法时,该调用所涉及的那个实例的运行时类型 (runtime type) 确定了要被调用的究竟是该方法的哪一个实现。在非虚方法调用中,实例的编译时类型 (compile-time type) 是决定性因素。当类或结构实现某个特定接口时,该类或结构的实例可以隐式地转换为该接口类型。例如
    EditBox editBox = new EditBox();
    IControl control = editBox;
    IDataBound dataBound = editBox;
    在无法静态知道某个实例是否实现某个特定接口的情况下,可以使用动态类型强制转换。例如,下面的语句使用动态类型强制转换获得对象的 IControl 和 IDataBound 接口实现。由于该对象的实际类型为 EditBox,此强制转换成功。
    object obj = new EditBox();
    IControl control = (IControl)obj;
    IDataBound dataBound = (IDataBound)obj;
      

  13.   


     public interface IEntityBase
     {
         string Id { set;get;  }
     } public class c1 : IEntityBase
     {
         string Id 
         {
            set
            {
                return "aaaa";
            }
         }
     } public class c2
     {
         string GetID(object value) 
         {
            if (value is IEntityBase)
               return (value as IEntityBase).Id;
            throw new Exception("不是一个有效的 IEntityBase 对象!");
         }    
     }