Как расширить класс MembershipUser без множественного наследования? - PullRequest
1 голос
/ 11 сентября 2009

На верхнем уровне у меня есть класс Person. Далее я хочу, чтобы класс .NET MembershipUser наследовал от него, потому что член - это человек. Однако я хочу расширить класс MembershipUser, что означает, мне кажется, мне нужно создать свой СОБСТВЕННЫЙ класс MembershipUser, который наследуется от MembershipUser, а затем добавляет мои собственные свойства. Но как только я это сделаю, я больше не могу наследовать от Person из-за нескольких правил наследования (ASP.NET 2.0).

1 Ответ

1 голос
/ 12 сентября 2009

Вы можете решить эту проблему, создав интерфейс IPerson и заменив конкретный класс Person классом, который наследуется от MembershipUser и реализует IPerson.

Вы также можете оставить свой конкретный Person, создать IPerson и иметь свой собственный класс, инкапсулирующий экземпляр Person и наследующий от MembershipUser при реализации IPerson.

В любом случае, везде, где вы когда-то использовали конкретный тип Person, вы должны заменить на IPerson (например, аргументы метода).

interface IPerson
{
    string LastName { get; set; }
    // ...
}

class MyMembershipUser : MembershipUser, IPerson
{
    private Person _person = new Person();

    // constructors, etc.

    public string LastName
    {
        get { return _person.LastName; }
        set { _person.LastName = value; }
    }
}

В качестве альтернативы вы можете продолжить использовать Person и инкапсулировать его в экземпляр MembershipUser (как часть конструктора) и включить явное приведение Person к MembershipUser при необходимости ...

class Person
{
    private readonly MembershipUser _mu;
    public Person(MembershipUser mu)
    {
        _mu = mu;
    }

    public static explicit operator MembershipUser(Person p)
    {
        // todo null check
        return p._mu;
    }
}

// example
var person = new Person(Membership.GetUser("user"));
Membership.UpdateUser((MembershipUser)person);

Я бы сам пошел с решением по реализации интерфейса.

...