.net OOP设计气味?

.net OOP设计气味?,.net,polymorphism,oop,.net,Polymorphism,Oop,摘要 实际上,我正在编写一个面向对象的类库,用于在VisualBasic.NET2005中处理Active Directory 该库允许管理组织单位、组和用户 我已尽可能地将代码概括为(简化的): 现在,当我通过我的Domain.Add方法将任何类型的实例添加到我的Domain.Entries中时,我可以调用Domain.AcceptChanges方法,以便处理任何实例 My域。Entries属性是(DirectoryEntryBase的)ICollection 问题 正是在调用我的Domain

摘要
实际上,我正在编写一个面向对象的类库,用于在VisualBasic.NET2005中处理Active Directory

该库允许管理组织单位、组和用户

我已尽可能地将代码概括为(简化的):

现在,当我通过我的
Domain.Add方法将任何类型的实例添加到我的
Domain.Entries
中时,我可以调用
Domain.AcceptChanges方法
,以便处理任何实例

My
域。Entries
属性是(DirectoryEntryBase的)ICollection

问题
正是在调用我的
Domain.AcceptChanges方法时,我发现自己被束缚住了,因为我需要访问
组织单元.Children
组.Members
集合,这取决于它们的类型

Public Class Domain
    Public Sub AcceptChanges()
        For Each e As DirectoryEntry In Entries
            'How may I find out what collection to work with here?'
        Next
    End Sub
End Class
我曾想过推广这个集合,但话说回来,词汇从一个对象变为另一个对象。至于OU,我们可能会谈论儿童,而对于一个团体,我们会说成员等等。事实上,这些并不代表相同的现实,所以我想我会概括这个集合是因为一个不好的原因

有什么想法吗


谢谢

我认为您应该将集合进行一般化,例如,作为一个“
基本列表”
,其中包含OrganizationalUnit.Children和Group.Members的公共属性

然后,子类和成员类可以扩展该基类,并添加在接受更改时需要出现的其他自定义功能

总而言之:

public class BaseList
{
 public virtual void Persist(...);
 // Common stuff
}

public class Children
{
 public override void Persist(...)
 {
   // do custom stuff
 }
}

public class Members
{
 public override void Persist(...)
 {
   // do custom stuff
 }
}
然后,您可以循环遍历一组“
BaseList
”并调用每个persist方法

public class BaseList
{
 public virtual void Persist(...);
 // Common stuff
}

public class Children
{
 public override void Persist(...)
 {
   // do custom stuff
 }
}

public class Members
{
 public override void Persist(...)
 {
   // do custom stuff
 }
}