有没有办法将字段定义为私有(private)
,但仍然可以使用包含类的泛型在方法中进行修改?
(对问题的长度表示歉意;我正在努力准确地确定我要问的内容)
具体来说,我目前有三个类A
、B
、C
,具有以下要求:
B
和C
有一个名为name
的字段,但A
没有A
和C
有一个方法Load()
,但B
没有B
和C
的集合在自定义Add()
方法中使用name
,但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)集
,这个解决方案对我有用。但是有没有办法正确封装x.Name
,以便Add
可以修改x.Name
,但是x.Name
无法在 B
和 C
实例中修改?
最佳答案
简短的回答是否。您不能有选择地将成员公开给特定的类,并且 MyList
与 IClass
无继承关系。
然而,您可以做的是创建一个额外的内部接口(interface)(或者可能使 IClass
内部)来公开 Name
属性并显式实现它。这意味着为了读/写 Name
属性,您需要将实例强制转换为内部接口(interface),这仅在定义它的程序集中才可能。
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>
类,它是为集合继承而设计的。
关于C#:将字段定义为私有(private)但可在泛型中修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10266731/