有没有其他方法可以在C#/ .NET中实现Overriding(非虚拟和覆盖)?

时间:2011-07-14 04:50:22

标签: c# .net oop

有没有人能告诉我在C#/ .NET中没有使用虚拟/抽象/覆盖的方法可以覆盖任何其他方法,请给我一个例子。请提供一个例子...... (我在想的是扩展方法,我是正确的.....)

3 个答案:

答案 0 :(得分:1)

您可以在方法上使用“new”关键字来“隐藏”未声明为abstract / virtual的方法,但是如果从类型转换为基类调用该方法,则不会打电话给你的新方法。这与覆盖相似。

示例:

public class A
{
    public string GetName() { return "A"; }
}

public class B : A
{
    // this method overrides the original
    public new string GetName() { return "B"; }
}

扩展方法允许您向任何类添加新方法,即使您没有源代码或密封它们也是如此。这与重写

不同
public sealed class A // this could even be from a dll that you don't have source code to
{
}
public static class AExtensionMethods
{
    // when AdditionalMethod gets called, it's as if it's from inside the class, and it            
    // has a reference to the object it was called from. However, you can't access
    // private/protected fields.
    public static string AdditionalMethod(this A instance)
    {
        return "asdf";
    }
}

另一种选择是使用接口,这样你就可以拥有两个完全不同的对象,它们都具有相同的方法,但是当从一个类型转换为接口的变量调用时,它看起来类似于覆盖。

你也可以使用像Microsoft Moles或CastleWindsor这样的Proxy Mocking框架形式 - >它们有一种实例化“代理”对象的方法,该对象具有与真实对象相同的接口,但可以为每种方法提供不同的实现。

答案 1 :(得分:1)

不,没有别的办法。如果基本方法未标记为new,则可以隐藏现有方法virtual,但它没有相同的效果(没有多态性 - 调用将基于变量类型而不是实际对象类型调度。

答案 2 :(得分:1)

在这种情况下,扩展功能不起作用。对象拥有的属性和方法优先。但是,您可以使用扩展名重载方法。

您可以覆盖扩展中定义的方法,方法是将扩展名放在命名空间中,使其更接近您要使用它的位置。

示例:

namespace ConsoleApplication2

{

    using System;

    using ConsoleApplication3;

    internal class Program
    {
        private static void Main(string[] args)
        {
            ThirdPartyClass t = new ThirdPartyClass();
            Console.WriteLine(t.Fun("hh"));
            Console.WriteLine(t.Fun(1));
        }
    }


    public static class LocalExtension
    {
        public static string Fun(this ThirdPartyClass test, int val)
        {
            return "Local" + val;
        }

        public static string Fun(this ThirdPartyClass test, string val)
        {
            return "Local" + val;
        }
    }
}


namespace ConsoleApplication3

{

    public class ThirdPartyClass
    {
        public virtual string Fun(string val)
        {
            return "ThirdParty" + val.ToUpper();
        }
    }


    public static class ThripartyExtension
    {
        public static string Fun(this ThirdPartyClass test, int val)
        {
            return "ThirdParty" + val;
        }
    }
}