LINQ2SQL中的抽象类用于共享常用方法

时间:2010-08-11 19:09:28

标签: c# linq-to-sql abstract-class

我在尝试在linq2sql设计器创建的两个类之间实现共享方法/属性时遇到了麻烦。

我的两个类有两个主要属性(来自db模型):

public partial class DirectorPoll
{
    public bool Completed {get; set;}
    public bool? Reopen { get; set; }
    //more properties
}

public partial class StudentPoll
{
    public bool Completed {get; set;}
    public bool? Reopen { get; set; }
    //more properties
}

现在举个例子我创建一个抽象类:

public abstract class GenericPoll
{
    public abstract bool Completed { get; set; }
    public abstract bool? Reopen { get; set; }

    public bool CanEdit
    {
        get
        {
            if (Completed == false) return true;
            if (Reopen.GetValueOrDefault(false) == false) return false;
            return true;
        }
    }
}

然后

public partial class DirectorPoll : GenericPoll
public partial class StudentPoll: GenericPoll

但是当我尝试编译它时,“Director没有实现继承的抽象成员GenericPoll.Completed.get”。但它就在那里。所以我想我被迫对设计器自动生成的属性进行覆盖,但如果我稍后更新数据库并重新编译它会给我同样的错误。

我想我可能会在这里遗漏一些东西,但我尝试了不同的方法但没有成功。 ¿那么除了在我的每个分部课程中实现CanEdit之外,我还能做什么呢?感谢

2 个答案:

答案 0 :(得分:2)

一个选项:创建一个包含CompletedReopen的接口,使类实现接口(通过部分类的手动位),然后编写扩展该接口的扩展方法。我认为应该有效:

public interface IPoll
{
    bool Completed {get; set;}
    bool? Reopen { get; set; }
}

// Actual implementations are in the generated classes;
// no need to provide any actual code. We're just telling the compiler
// that we happen to have noticed the two classes implement the interface
public partial class DirectorPoll : IPoll {}
public partial class StudentPoll : IPoll {}

// Any common behaviour can go in here.
public static class PollExtensions
{
    public static bool CanEdit(this IPoll poll)
    {
        return !poll.Completed || poll.Reopen.GetValueOrDefault(false);
    }
}

不可否认,它必须是一种方法而不是财产,因为没有扩展属性这样的东西,但这并不是太困难。

(我相信我在CanEdit中对你的逻辑进行重构是正确的。所有那些明确的真理和谬误都在我的脑海中;)

答案 1 :(得分:2)

它未实现为override,因此不计算在内。但是,隐式接口实现执行计数,因此这有效:

partial class DirectorPoll : IGenericPoll {}
partial class StudentPoll : IGenericPoll {}
public interface IGenericPoll
{
    bool Completed { get; set; }
    bool? Reopen { get; set; }
}
public static class GenericPoll {
    public static bool CanEdit(this IGenericPoll instance)
    {
        return !instance.Completed || instance.Reopen.GetValueOrDefault();
    }
}