代码之家  ›  专栏  ›  技术社区  ›  Eamon Nerbonne

C#:接口继承getter/setter

  •  28
  • Eamon Nerbonne  · 技术社区  · 15 年前

    该对象的许多用户只需要能够从该对象读取值,然后只需要几个属性。为了避免名称空间污染(更简单的智能感知)和理解使用意图,我希望有一个小的基本接口,它只以只读方式公开一些“键”属性。

    不幸的是,我在C#中遇到了表达这一概念的障碍:

    interface IBasicProps {
       public int Priority { get; }
       public string Name {get;}
       //... whatever
    }
    
    interface IBasicPropsWriteable:IBasicProps  {
       public int Priority { set; } //warning CS0108: [...] hides inherited member [...]
       public string Name { set; }
       //... whatever
    }
    

    当然,我可以用方法很好地解决这个问题,但是问题是什么 正确的 选择?我希望保持“核心”接口尽可能小,即使拆分接口除了通信目的之外没有其他用途。对于拆分接口,很明显哪些方法不会进行任何更新,并且它使编写代码更加清晰(更不用说还允许nice-n-simple静态单例存根,可以满足相当多的简单情况)。

    那么,想法呢?

    4 回复  |  直到 15 年前
        1
  •  31
  •   Marc Gravell    15 年前

    隐藏在接口中的方法并没有那么单调;我会选择这样的方式:

    interface IBasicProps {
       int Priority { get; }
       string Name {get;}
       //... whatever
    }
    
    interface IBasicPropsWriteable:IBasicProps  {
       new int Priority { get; set; }
       new string Name { get; set; }
       //... whatever
    }
    class Foo : IBasicPropsWriteable {
        public int Priority {get;set;}
        public string Name {get;set;}
    /* optional
        int IBasicProps.Priority {get {return Priority;}}
        string IBasicProps.Name {get {return Name;}}
    */
    }
    
        2
  •  4
  •   Jeffrey L Whitledge    15 年前

    如果您的目标是在允许读和写时使其更清晰,那么我将使用单独的getter和setter方法,而不是属性。

    interface IBasicProps {
       int GetPriority();
       string GetName();
       //... whatever
    }
    
    interface IBasicPropsWriteable:IBasicProps  {
       void SetPriority(int priority);
       void SetName(string name);
       //... whatever
    }
    
        3
  •  2
  •   Fredrik Mörk    15 年前

    一种方法是跳过接口的继承。制作一个只读接口和一个只读写接口,并根据需要实施:

    interface IBasicPropsReadable {
       int Priority { get; }
       string Name { get; }
    }
    
    interface IBasicPropsWriteable  {
       int Priority { set; }
       string Name { set; }
    }
    
    class SomeClassReadWrite : IBasicPropsReadable, IBasicPropsWriteable {
        int Priority { get; set; }
        string Name { get; set; }
    }
    
    class SomeClassReadOnly : IBasicPropsReadable {
        int Priority { get; }
        string Name { get; }
    }
    
        4
  •  1
  •   tvanfosson    15 年前

    您可以让接口不相关,只需让您的类实现这两个接口。在所有接口都只是定义了契约之后,契约不需要关联。在编码时,让可写的一个从另一个派生出来似乎只是一种优化,因此只需指定一个接口。

    public interface IBasicProps
    {
       int Priority { get; }
       string Name {get;}
       //... whatever
    }
    
    public interface IBasicPropsWriteable
    {
       int Priority { get; set; }
       string Name { get; set; }
       //... whatever
    }
    
    public class Foo : IBasicProps, IBasicPropsWriteable
    {
       public int Priority { get; set; }
       public string Name { get; set; }
    
       // whatever
    }
    

    如果您确实需要优化,您可以创建另一个从这两者派生的接口,并让您的类实现它。

    public interface IBasicPropsAll : IBasicProps, IBasicPropsWriteable  { }
    
    public class Foo : IBasicPropsAll
    {
       public int Priority { get; set; }
       public string Name { get; set; }
    
       // whatever
    }