代码之家  ›  专栏  ›  技术社区  ›  Sarah Vessels

C内部getter,带有内部类参数的受保护setter

  •  7
  • Sarah Vessels  · 技术社区  · 15 年前

    我有一个问题,想要一个属性有一个内部getter和一个受保护的setter,如中所述。 this question 我想我通过以下步骤解决了这个问题:

    public class Accessor : AccessorBase
    {
        private Connection _connection;
    
        protected void setConnection(Connection value)
        {
            _connection = value;
        }
    
        internal Connection GetConnection()
        {
            return _connection;
        }
        ...
    }
    

    但是,我现在得到这个错误:

    可访问性不一致:参数类型“connection”比方法“setconnection(connection)”的可访问性低

    这是因为我有 internal class Connection . 我宁愿不做 Connection 一个公共阶级,而 Accessor 需要 要公开,那么在保持内部getter和受保护的setter的同时,如何才能避免这个错误呢?

    7 回复  |  直到 6 年前
        1
  •  9
  •   Pent Ploompuu    6 年前

    不幸的是,C不支持“内部 受保护的“访问修饰符”(仅限“内部 “受保护”,这意味着 protected 成员在程序集外部可见,不能使用内部类型。
    使用 internal 而不是 受保护的 将是最合乎逻辑的解决方案。

    你可以 vote at Microsoft Connect 以便有一天可以添加到C中。

    更新:从C 7.2起,您可以使用 private protected 为此。

        2
  •  5
  •   Randolpho    15 年前

    创建公共接口 IConnection 你的内部 Connection 对象实现。有你 GetConnection SetConnection 方法接受和返回 形象化 而不是 连接 .

    基本的 SOLID 原则又赢了。

        3
  •  2
  •   Community CDub    8 年前

    …任何受保护的成员都可见 在程序集外部,不能使用 内部类型。

    —— Pent Ploompuu's answer

    解决这个问题的方法之一是 Connection 将其所有实例方法和构造函数设置为内部时是公共的。

        4
  •  1
  •   Coincoin    15 年前

    如果类连接是内部的,则类派生访问器将无法调用受保护的setconnection,因为它无权访问连接。

    如果要保护setConnection,则连接必须是公共的。

        5
  •  0
  •   Arjan Einbu    15 年前

    抱歉,如果您需要精确的设置,您需要 Connection 班级公开。

        6
  •  0
  •   albertein    15 年前

    毫无疑问,你不能这样做。自从 Connection 是内部的,某些从另一个程序集的访问器派生的类将看不到 连接 ,即使您将setter标记为 protected internal 它什么也解决不了。

    您唯一的希望是公开类连接。

        7
  •  0
  •   Community CDub    8 年前

    Coincoin is correct , Accessor 是一个任何人都能从中派生出来的公共类,这意味着它也来自不同的程序集。该派生类现在具有保护方法,您需要将内部(来自其他程序集)类传递给该方法。这永远行不通。

    你要么做 存取器 内部或 Connection 公开的,或者更好的是跟随 Randolphos answer

    下面是这个问题的代码示例

    组件1

    //this class is only visible in Assembly 1
    internal class Connection
    {
    
    }
    public class Accessor
    {
       protected void SetConnection(Connection con) { }
    }
    

    程序集2-引用程序集1

    //possible because Accessor is public
    DerivedAccessor : Accessor
    {
       void SomeMethod()
        {
            this.SetConnection(????) // you can't pass Connection, its not visible to Assembly2 
        }
    }