扩展方法和继承之间是否存在关联?或者说,扩展方法是否类似于在C#中使用new
关键字?
扩展方法和继承之间是否存在关联?或者说,扩展方法是否类似于在C#中使用new
关键字?
两个问题都是否定的。扩展方法实际上是一个以扩展操作对象为第一个参数的方法。
new
关键字用于为类的实例分配资源。扩展方法作用于实例,但不能作为新实例的替代,因为它需要一个实例(或该类型的null
)作为第一个参数。
考虑以下示例:
public static class StringExtensions
{
public static string Reverse(this string _this)
{
// logic to reverse the string
}
}
// as an extension method:
string s = "hello world";
string t = s.Reverse();
// as a static method invocation:
string t = StringExtensions.Reverse(s);
this
关键字。
总结一下:
new
关键字那样实例化类(但在方法内部,您当然可以实例化类)。null
,而否则该类的方法会引发NullReferenceException
。这源于实例只是静态方法中的第一个参数。string
),这在继承中是不可能的(您不能从密封类派生)。new
关键字的任一含义都没有关系。但是,以下是一些相关想法。我希望它不会让事情更加混乱。如果是这样,请坚持上面“编辑”部分的内容;)
On the new modifier:
On the new generic constraint:
an extension method itself van be generic and the parameters (i.e., the allowed classes it operates on) can be limited by the new generic constraint:
// this ext. method will only operate on classes that inherit
// from ICollectible and have a public parameterless constructor
public static int CalculateTotal<T>(this T _collectible)
where T : ICollectible, new()
{
// calculate total
}
new object()
不会被误解为面向对象编程概念。 - Tigrannew
只能隐藏具有 完全 相同签名的方法。但我同意,这比我最初写的更可能是 OP 的意思。 - Abelnew
关键字需要允许您从基类override
非虚拟和静态方法。public class A
{
public virtual void One();
public void Two();
}
public class B : A
{
public override void One();
public new void Two();
}
B b = new B();
A a = b as A;
a.One(); // Calls implementation in B
a.Two(); // Calls implementation in A
b.One(); // Calls implementation in B
b.Two(); // Calls implementation in B
new
,这与使用 override
覆盖略有不同。 - Abel扩展方法与继承或new
关键字(或构造函数)无关。如果您想为一个没有源代码的类添加一些功能,它允许您编写更好的代码。如果您有源代码,那么更改源代码通常更好。
例如,您可能想要能够执行此操作:
string text = "this is my string";
int count = text.WordCount();
这个方法在String
类中不存在,你需要像这样做:
string text = "this is my string";
int count = MyCommon.WordCount(text);
这里的WordCount()
是您某些常用库中的静态方法。
但是使用扩展方法,您还可以执行以下操作:
public static class MyExtensions
{
public static int WordCount(this String str)
{
return str.Split(new char[] { ' ', '.', '?' },
StringSplitOptions.RemoveEmptyEntries).Length;
}
}
然后text.WordCount()
就像在String
类中定义的普通方法一样工作。这只是使使用起来更加方便。
代码取自这里,我建议也阅读一下。
new
关键字的三个主要含义中您指的是哪一个,那将对我们有所帮助:类实例化(例如new House()
)、方法覆盖(例如当继承一个包含Activate
方法的类时写成new public void Activate()
)、或者泛型约束中的new()
(例如where T: new()
)。 - Abel