【问题标题】:How can I limit class usage?如何限制课堂使用?
【发布时间】:2013-05-18 10:47:00
【问题描述】:

我有一个List<object> 的列表。我怎样才能限制只有Class1Class2 应该使用列表?

Class1Class2 基本上是不同的。我猜想这两个类都有什么基本类,并限制 List 只能使用它,但真的不知道。

【问题讨论】:

  • public abstract class ClassAbstractpublic class Class1 : ClassAbstractpublic class Class2 : ClassAbstractList<ClassAbstract>。你可以对界面做同样的事情。
  • 您正在寻找称为接口的概念。 msdn.microsoft.com/en-us/library/87d83y5b%28v=vs.80%29.aspx
  • 您如何使用列表中的项目?您是否使用isas 来查看如何处理它们?只是看起来有点奇怪。

标签: c# .net oop inheritance


【解决方案1】:

创建一个两个类都实现的接口

public interface MyInterface 
{
}

public class Class1 : MyInterface
{
}

public class Class2 : MyInterface
{
}

List<MyInterface> myList = new List<MyInterface>();

可以在列表中引用的类的唯一实例是那些实现MyInterface 接口的实例。在这种情况下,只有Class1Class2

【讨论】:

  • 请注意“Class1 和 Class2 基本不同”,这可能表示互接口方式不起作用。 :)
  • @David 确实如此。 Class1Class2 没有相同的东西。
  • 我不同意,他们都有“需要进入列表”的观点。所以这是他们的共同属性。接口本身可能为空以反映这一点。如果它们如此不同以至于无法制作界面,那么制作两种类型的列表也没有多大意义。
  • 我同意 Bazzz 的观点。检查marker interface pattern
  • @MehmetAtaş 感谢您的支持并添加相关文章。
【解决方案2】:

我确信Bazz's answer 是处理此类要求的正确方法

但是,您可以尝试另一种方法:

public class MyCustomList : ArrayList
{
    public override void Add(object item){
        if(item is Class1 || item is Class2) {
            base.Add(item);
        }
        else {
            throw BadaboomException();
        }
    }
} 

或者您可以通过完全包装集合来确保签名

public class MyCustomList : ICollection
{
    private readonly ArrayList m_InnerList = new ArrayList();

    public virtual void Add(Class1 item) {
        this.m_InnerList.Add(item);
    }
    public virtual void Add(Class2 item) {
        this.m_InnerList.Add(item);        
    }


    public void CopyTo(Array array, int index) { 
        m_InnerList.CopyTo(array, index);
    }

    public int Count { get { return m_InnerList.Count; } }
    public bool IsSynchronized { get{ return m_InnerList.IsSynchronized; } }
    public object SyncRoot { get{ return m_InnerList.SyncRoot; } }

    public IEnumerator GetEnumerator(){
        return m_InnerList.GetEnumerator();
    }

} 

【讨论】:

    猜你喜欢
    • 2015-08-30
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    相关资源
    最近更新 更多