简体   繁体   中英

Generic Class inherit from T

Can I inherit my class from a generic type T ? For example:

public abstract class BasePage<T> : T, IDisposable where T : Page 
{
    // Realization
}

I need to do this to provide basic functionality to other types of pages.

public class ContentBasePage : BasePage<ContentPage>
{ }

public class TabbedBasePage : BasePage<TabbedPage>
{ }

But I need to have ContentBasePage inherited from ContentPage, TabbedBasePage is inherited from TabbedPage. This is necessary to use this class in the Xaml markup. I can create a shared interface IBaseType, but the code will be duplicated

My full BasePage class, this isn't work:

public abstract class BasePage<T> : IDisposable where T : Page
{
    #region Private Fields

    protected BaseViewModel BaseViewModel { get; private set; }

    #endregion


    #region Init / Dispose

    ~BasePage()
    {
        Dispose();
    }

    public void Dispose()
    {
        BaseViewModel?.Dispose();
    }

    #endregion


    #region Public Methods

    public void SetViewModel(BaseViewModel viewModel)
    {
        BindingContext = BaseViewModel = viewModel;
    }

    #endregion


    #region Override Methods

    protected override void OnAppearing()
    {
        base.OnAppearing();
        Task.Run(async () => {
            await Task.Delay(50); // Allow UI to handle events loop
            if (BaseViewModel != null)
                await BaseViewModel.OnPageAppearing();
        });
    }

    protected override void OnDisappearing()
    {
        base.OnDisappearing();
        Task.Run(async () => {
            await Task.Delay(50); // Allow UI to handle events loop
            if (BaseViewModel != null)
                await BaseViewModel.OnPageDissapearing();
        });
    }

    #endregion
}

Can I inherit my class from T class?

You cannot inherit from T since it is just a placeholder for a type. The compiler will not know what structure to apply because there is none.

The documentation says:

a type parameters is a placeholder for a specific type that a client specifies when they instantiate a variable of the generic type. A generic class, such as GenericList listed in Introduction to Generics, cannot be used as-is because it is not really a type; it is more like a blueprint for a type .

You need to remove the T from the inheritance declaration:

public abstract class BasePage<T> : IDisposable where T : Page

But you can inherit from a generic class like in your example BasePage<T> . When you do this you have to specify the type of T in the derived class like you did:

public class ContentBasePage : BasePage<ContentPage>

Your code will work if ContentPage and TabbedPage inherit from Page

Since the title of this question was 'Generic Class inherit from T', it looked like duplicate of this StackOverflow post but sounds like you are just after a pattern to avoid duplication (based on your comment on your own question and no reference to T in the code example of BasePage<T> that you put in question). In that case I wouldn't use generic. It would become simple case of inheritance. Would following solution work for you?

public class Page
{
    public string PageProperty { get; set; }
}
public abstract class BasePage : Page, IDisposable
{
    public void Dispose()
    {
    }
}

public class ContentPage : BasePage
{
    public string ContentProperty { get; set; }
}

public class TabbedPage : BasePage
{
    public string TabbedProperty { get; set; }
}

public class ContentBasePage : ContentPage{}

public class TabbedBasePage : TabbedPage{}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM