派生集合 class

collection of derived class

我正在重构我的关注点分离 (SoC) 代码。将非 AutoCAD 代码移到单独的 dll,因此 Common、Data Access、Web 服务、AutoCAD 相关……在不同的 dll 文件中。

这是我的示例 class:

// non-AutoCAD dll
public class Loc
{
    public int Id;
    public string Name;
    ...
}

// AutoCAD dll
public class AcadLoc : Loc
{
    public ObjectId oid;
}

// non-AutoCAD dll
public class Locs : List<Loc>
{
    public Loc Get_By_Id(long id)
    {
        return this.SingleOrDefault(n => n.Id == id);
    }
}

// AutoCAD dll
public class AcadLocs : Locs // or List<AcadLoc> ? 
{
}

我的问题是,我可以运行像

这样的东西吗?
AcadLocs myAcadLocs = new AcadLocs();
AcadLoc myAcadLoc = myAcadLocs.Get_By_Id(1);   // How to make this works? 

我试过:

public class AcadLocs : Locs // or List<AcadLoc> ? 
{
    public AcadLoc Get_By_Id(int id)
    {
        return this.SingleOrDefault(n => n.Id == id);
    }
}

这是行不通的。

现在我改成这样:

public interface ILocData<T> where T : new() {} 

// non-AutoCAD dll
public class Loc : ILocData<Loc>
{
    public int Id;
    public string Name;
    ...
}

// AutoCAD dll
public class AcadLoc : Loc, ILocData<AcadLoc>
{
    public ObjectId oid;
}

public class LocDataCollection<T, TCollection> : List<T>
    where T : ILocData<T>, new()
    where TCollection : LocDataCollection<T, TCollection>, new()
{
}

// non-AutoCAD dll
public class Locs : LocDataCollection<Loc, Locs>
{
    public Loc Get_By_Id(int id)
    {
        return this.SingleOrDefault(n => n.Id == id);
    }

    public bool Check()
    {
        foreach (Loc loc in this)
        {
        ....
        }
    }
}

// AutoCAD dll  
public class AcadLocs : LocDataCollection<AcadLoc, AcadLocs>
{
    public AcadLoc Get_By_Id(int id)
    {
        return this.SingleOrDefault(n => n.Id == id);
    }
}

现在,

AcadLoc myAcadLoc = myAcadLocs.Get_By_Id(1);   // works

但是

myAcadLocs.Check();  // failed

谢谢

韦斯

我想你需要的是扩展方法

public static class MyExtension 

{
    public static Loc Get_By_Id(this Locs l,int id) 
    {
        return l.SingleOrDefault(n => n.Id == id);
    }

    public static bool Check(this Locs l)
    {
        foreach (Loc loc in l)
        {
        ....
        }
    }
}

一旦你有了这段代码,就可以像这样调用这个方法

 myAcadLocs.Get_By_Id(1);
 myAcadLocs.Check();
 myLocs.Get_By_Id(1);
 myLocs.Check();

我指的是你的第一次尝试。

1。继承

public class AcadLocs : Locs // or List<AcadLoc> ? 

如果你想派生自LocsList<AcadLoc>取决于你想如何使用这个class。如果你想声明公共成员,或者如果有必要,你可以将 AcadLocs 的实例分配给类型 Locs 的变量,如下所示

Locs locs = new AcadLocs();

那么你肯定需要从 Locs.

派生

2。 Get_By_Id

对于此方法,我将使用 OfType<> 方法,如下所示:

public class AcadLocs : Locs // or List<AcadLoc> ? 
{
    public AcadLoc Get_By_Id(int id)
    {
        return this.OfType<AcadLoc>().SingleOrDefault(n => n.Id == id);
    }
}

OfType<AcadLoc> 从现有序列中创建一个 IEnumeralbe<AcadLoc>,仅选择指定类型 (AcadLoc) 的元素。这也将帮助您使用 Check 方法。