2012-08-05 70 views
5

请看看我的班级结构。我想我想继承更多的乐趣。C# - 高级继承

首先出现的是一个抽象基类:

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

接下来还有另外一个抽象类,这是通用的:

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

最后,还有一个具体的策略类。 AccidentContainer从DataContainer继承:

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

在编译过程中,我得到了以下错误:

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

我不知道我应该用什么修饰这里得到它的工作。也许我也应该写下我想达到的目标:我有一组不同类型的策略对象(例如PolicyAccident,PolicyTravel等),它们从PolicyDetailed继承了不同类型的DataContainer(AccidentContainer,TravelContainer等)。我想在他们每个人身上调用“GetActiveAsset”方法,但不知道他们的具体类型,并通过PolicyDetailed引用它们。同时,我希望每个类都返回他们特定的Datacontainer子类。那可能吗?

+0

对于您声明特定容器类型是否返回其特定策略类型是否真的很重要?你说你想引用返回的对象作为PolicyDetailed,这样你就失去了具体的信息! (请记住,AccidentContainer _IS_ DataContainer和AccidentContainer因此可以从返回类型为DataContainer的方法返回,而根本不会更改任何签名) – olagjo 2012-08-05 22:02:47

+0

我在代码的其他部分需要它,我在其中引用特定类型的策略并使用它容器。我可能会考虑使用两种方法 - 一种会返回一个DataContainer对象,其次可能会返回一个特定的容器(但它感觉很笨拙) – Rummy 2012-08-06 12:51:17

回答

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; 
        }  
    } 
    
  • 可以介绍继承的另一个层面,用于桥接目的引入一个新的方法名称只是。这是很丑陋:

    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类的接口来代替,并用显式接口实现声明一个新的抽象方法,并且仍然实现接口。