Абстрактный класс в LINQ2SQL для совместного использования общих методов - PullRequest
1 голос
/ 11 августа 2010

У меня возникают проблемы при попытке реализовать общий метод / свойство между двумя классами, созданными конструктором linq2sql.

У моих двух классов есть два основных свойства (исходя из модели БД):

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

Но когда я пытаюсь скомпилировать, он говорит: «Директор не реализует унаследованный абстрактный член GenericPoll.Completed.get». Но это там. Поэтому я думаю, что вынужден установить переопределение для свойства, автоматически сгенерированного дизайнером, но если я обновлю базу данных позже и перекомпилирую, это вызовет ту же ошибку.

Я думаю, что здесь что-то не хватает, но я пробовал разные подходы, но безуспешно. ¿Так что же я могу сделать здесь, кроме реализации CanEdit в каждом из моих частичных классов? Спасибо

Ответы [ 2 ]

2 голосов
/ 11 августа 2010

Он не реализован как override, поэтому он не считается.Однако неявные реализации интерфейса do count, так что это работает:

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();
    }
}
2 голосов
/ 11 августа 2010

Один вариант: создать интерфейс, содержащий 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 правильный. Все эти явные истины и ложные высказывания были в моей голове;)

...