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