C# - 高级继承

Rum*_*mmy 5 c# polymorphism inheritance

请看看我的班级结构.我想我希望继承的乐趣超过可能.

首先是一个基础抽象类:

public abstract class PolicyDetailed
{
    internal abstract DataContainer GetActiveAsset();
}
Run Code Online (Sandbox Code Playgroud)

接下来是另一个抽象类,它是通用的:

public abstract class PolicyDetailed<T> : PolicyDetailed where T : DataContainer
{
    internal new abstract T GetActiveAsset();
}
Run Code Online (Sandbox Code Playgroud)

最后有一个特定的政策类.AccidentContainer继承自DataContainer:

public class PolicyAccident : PolicyDetailed<AccidentContainer>
{
    internal override AccidentContainer GetActiveAsset()
    {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

在编译期间,我收到以下错误:

'PolicyAccident' does not implement inherited abstract member 'PolicyDetailed.GetActiveAsset()'  
Run Code Online (Sandbox Code Playgroud)

我不确定我应该在这里使用什么修饰符来使它工作.也许我还应该编写我想要实现的内容:我有一组不同类型的策略对象(例如PolicyAccident,PolicyTravel等),它们使用不同类型的DataContainer(AccidentContainer,TravelContainer等)从PolicyDetailed继承.我想在每个方法上调用"GetActiveAsset"方法,而不知道它们的具体类型并通过PolicyDetailed引用它们.同时我希望每个类返回其特定的Datacontainer子类.那可能吗?

Jon*_*eet 6

问题是您不能在声明具有相同签名的任何其他方法的同一类中覆盖非泛型方法.

有几个选择:

  • 到目前为止,最简单的方法是给这两种方法赋予不同的名称.然后,您可以提供一个实现,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;
        }    
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 可以引入另一级继承,仅为桥接目的引入新方法名称.这很难看:

    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;
        }            
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 您可以将非泛型PolicyDetailed类改为接口,并使用显式接口实现来声明新的抽象方法并仍然实现接口.