C # - extended inheritance

Please take a look at my class structure. I think I would like to enjoy inheritance more than is possible.

First there is a base abstract class:

public abstract class PolicyDetailed
{
    internal abstract DataContainer GetActiveAsset();
}

Next, there is another abstract class that is generic:

public abstract class PolicyDetailed<T> : PolicyDetailed where T : DataContainer
{
    internal new abstract T GetActiveAsset();
}

Finally, there is a certain class of policy. AccidentContainer inherits from DataContainer:

public class PolicyAccident : PolicyDetailed<AccidentContainer>
{
    internal override AccidentContainer GetActiveAsset()
    {
        return null;
    }
}

At compile time, I get the following error:

'PolicyAccident' does not implement inherited abstract member 'PolicyDetailed.GetActiveAsset()'  

, , . , , : (, PolicyAccident, PolicyTravel ..), PolicyDetailed DataContainer (AccidentContainer, TravelContainer ..). GetActiveAsset , PolicyDetailed. , Datacontainer. ?

+5
1

, - , .

:

  • . PolicyDetailed<T>, :

    public abstract class PolicyDetailed
    {
        internal abstract DataContainer GetActiveAsset();
    }
    
    public abstract class PolicyDetailed<T> : PolicyDetailed where T : DataContainer
    {
        internal abstract T GetActiveAssetGeneric();
    
        internal override DataContainer GetActiveAsset()
        {
            return GetActiveAssetGeneric();
        }
    }
    
    public class PolicyAccident : PolicyDetailed<AccidentContainer>
    {
        internal override AccidentContainer GetActiveAssetGeneric()
        {
            return null;
        }    
    }
    
  • , . :

    public class DataContainer {}
    public class AccidentContainer : DataContainer{}
    
    public abstract class PolicyDetailed
    {
        internal abstract DataContainer GetActiveAsset();
    }
    
    // This only exists to satisfy the base class abstract member,
    // but at the same time allowing PolicyDetailed<T> to introduce
    // a new member with the same name.
    public abstract class PolicyDetailedBridge<T> : PolicyDetailed
        where T : DataContainer
    {
        protected abstract T GetActiveAssetGeneric();
    
        internal override DataContainer GetActiveAsset()
        {
            return GetActiveAssetGeneric();
        }
    }
    
    public abstract class PolicyDetailed<T> : PolicyDetailedBridge<T>
        where T : DataContainer
    {
        protected sealed override T GetActiveAssetGeneric()
        {
            // Call the *new* abstract method. Eek!
            return GetActiveAsset();
        }
    
        internal abstract new T GetActiveAsset();
    }
    
    public class PolicyAccident : PolicyDetailed<AccidentContainer>
    {
        internal override AccidentContainer GetActiveAsset()
        {
            return null;
        }            
    }
    
  • PolicyDetailed , , - .

+6

All Articles