2

private有没有办法使用包含类的泛型将字段定义为但仍可在方法中修改?

(为问题的长度道歉;我正在努力确定我在问什么)

具体来说,我目前有三个类A, BC具有以下要求:

  1. BC有一个名为 的字段name,但A没有
  2. A并且C有一个方法Load(),但B没有
  3. 集合B并在自定义方法中使用,但C不使用此方法nameAdd()A

这是我目前的解决方案:

public class BaseClass
{
    public SomeType Load() { ... }
}

public interface IClass {
    string Name {get; set;}
}

public class MyList : SomeCollection<IClass>
{
    // Depends on x.Name, and may modify Name before adding x to the collection
    public new void Add(IClass x) { ... }
}

public class A : BaseClass { ... }

public class B : IClass { ... }

public class C : BaseClass, IClass { ... }

如果Name有一个 public ,这个解决方案对我有用set。但是有什么方法可以正确封装x.Name以便Add可以修改x.Name,但x.Name不能在 and 的实例中B修改C

4

1 回答 1

2

简短的回答是否定的。您不能选择性地将成员公开给特定的类,并且MyListIClass. 但是,您可以做的是创建一个额外的内部接口(或可能使IClass内部接口)公开Name属性并显式实现它。这意味着为了读/写Name属性,您需要将一个实例强制转换为内部接口,这只有在它定义的程序集中才有可能。

internal interface IClassName { string Name { get; set; } }

public class MyList : Collection<IClass>
{
    protected override void InsertItem(int index, IClass item)
    {
        var className = item as IClassName;
        if (className != null)
        {
            // do something with className.Name ...
        }
        base.InsertItem(index, item);
    }
}

public class B : IClassName { string IClassName.Name { get; set; } }

请注意,我没有使用new关键字来绕过基类的Add方法,因为这会覆盖多态性(例如,如果您将一个实例强制MyList转换IList<IClass>为将被调用的原始实现Add- 这很糟糕。)相反,我是覆盖Collection<T>类中的适当方法,该方法专为集合继承而设计。

于 2012-04-22T09:47:42.213 回答