如果具体实现中存在重载方法,则隐藏虚拟方法实现

时间:2010-11-12 00:23:58

标签: c# .net-3.5 inheritance enums override

这是情况。我有一个基类,它实现一个接受字符串的方法,并将属性设置为该字符串的值。在那之下,我有一组实现基础的具体类。某些具体类可以接受要存储的任何字符串值。但是,某些类的值受限于Enumerated系列值。最终值仍然是一个字符串,但该值必须在该枚举的可能值集合中。

这是我想要做的事情:对于使用枚举限制值的类,我想对字符串方法实现一个重载,该方法使用正确的值调用字符串方法。但是,我还希望锁定字符串实现,以便只使用枚举实现来传递新值,以强制执行枚举限制。

我知道在这一点上,这不会通过在方法声明中使用override或new来实现。我也知道我可以创建像Base这样的层次结构 - > [BaseString | BaseEnum] - >具体并使用密封来保持具体实现不允许使用基于字符串的实现。我想知道的是,如果有另一种方法可以跳过额外的层次结构,并允许我只说“如果在具体类中存在方法重载,那么锁定方法。”

public class Abstract {
    public virtual string ValueHolder { get; private/protected set; }
    public virtual void DoSomething( string s ) { ...; }
}

public class ConcreteEnum : Abstract {
    public void DoSomething( Enum e ) { 
        base.DoSomething( "String somehow extracted from enum");
    }
}

public class ConcreteString : Abstract { ... }

public class Main {
    ConcreteString sc = new ConcreteString();
    ConcreteEnum se = new ConcreteEnum();

    sc.DoSomething( "I don't have an overload defined, 
        so I'm using my base's string handler method.  
        I can be any value, I have no restrictions." );

    se.DoSomething( SomeEnum.MyValueWillBeRunThroughTheBaseStringHandler );
    se.DoSomething( "I don't work because there's an
        overload defined in my concrete class, and my
        value is restricted to a specific set of
        possibilities." );
}

正如我所说,我知道还有其他可行的方法,我只想知道这是否可行/更清洁。

1 个答案:

答案 0 :(得分:2)

您基本上只需要验证派生类中的字符串:

public class ConcreteEnum : Abstract {
    public void DoSomething( Enum e ) { 
        base.DoSomething( "String somehow extracted from enum");
    }

    public override void DoSomething( string s ) {
        // Validate s, then do something with it
    }
}

您无法完全删除该方法,因为它是超类的成员,因此是类接口的一部分。例如,如果您将ConcreteEnum的实例传递给一个采用Abstract对象并期望DoSomething(string)方法起作用的方法,但它已经神奇地消失了,那么一切都会崩溃。

但是,当提供无效值时,您始终可以选择覆盖子类中的行为以抛出异常。您甚至可以覆盖它只是抛出NotSupportedException

编辑:如果基类DoSomething方法不应该被消耗,除非在子类中(不是说它,但你没有真正指定任何一种方式),为什么不只需将其设为protected