我在尝试在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之外,我还能做什么呢?感谢
答案 0 :(得分:2)
一个选项:创建一个包含Completed
和Reopen
的接口,使类实现接口(通过部分类的手动位),然后编写扩展该接口的扩展方法。我认为应该有效:
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();
}
}