我希望我的所有类都有一些行为,就像.net(ToString,GetHashCode等)中的所有类一样。 但我不想创建具有这些类型的函数的基类,并继承此基类中的所有类。通过这种方式,我将失去从任何其他类中继承我的类的自由(因为.net只支持从一个类继承)。
.net框架如何创建一个类而不从基础对象类入侵,但在所有类中都有虚拟行为?
我们不是这样写的
class MyClass : System.Object
{
}
但MyClass获取System.Object的虚函数。
答案 0 :(得分:2)
您不必明确声明您的类继承自System.Object
,因为如果您不想手动执行此类,编译器会强制您的类自动从System.Object
派生,因为它可能变得非常乏味的。
您可以通过在代码中声明一个类然后由编译器反汇编程序集输出来自行确认。我声明了一个类class Person { }
并反汇编了输出。生成以下IL
.class public auto ansi beforefieldinit Code.Person
extends [mscorlib]System.Object
如果您想在没有基类的类中定义一些常用功能,那么您可以考虑在System.Object
上编写扩展方法
public static class ExtensionMethods
{
public static void DoSomething(this object target)
{
}
}
您可以更明确地定义一个类可以实现的接口,然后定义所述接口的扩展方法。由于您可以实现的接口数量没有限制,因此可以减轻您对多重继承的担忧。
答案 1 :(得分:0)
要建立在ByteBlast的帖子上并解决harpo的问题,你可以使用带有扩展方法的装饰器接口。
public interface IMyDecorator{}
public interface IMySecondDecorator : IMyDecorator {}
public static class ExtensionMethods
{
public static void Print(this IMyDecorator target)
{
}
public static void Print(this IMySecondDecorator target)
{
}
}
答案 2 :(得分:0)
也许你想要做的事情可以用PostSharp完成?本质上,该工具会替换所有继承自System.Object的类,并继承自定义类的继承吗?
答案 3 :(得分:0)
这是一个有趣的问题,但我认为答案是,你做不到。如果您不愿意使用通用基类,则无法为从object
继承的方法提供通用行为。
如果这对你很重要,那么值得考虑基类路线。当然,你不能将它应用于框架类,但在许多情况下它们都是密封的(或不可见的)。
我一直在考虑这个问题,因为我正在使用一些除了为具有值类型语义的类提供GetHashCode
和Equals
覆盖之外什么都不做的类。在某些情况下,使用备用基类非常方便,但您无法通过任何其他方式(例如接口/扩展方法)覆盖这些行为。
答案 4 :(得分:0)
通用基类是解决此问题的明显答案,但不会为从应用程序类层次结构之外的类型继承的类提供“标准”实现。
我会考虑composition in place of inheritance。这是@ByteBlast和@PhilipScottGivens提出的内容的精髓。
为什么没有一个帮助器类为您提供GetHashCode
和ToString
方法的功能(我正在想象这两个方面的一些反映,以便您可以使用实例的成员/属性你的类型)以及所有对象需要的其他常用服务吗?
这个实例(或者帮助器具有将实例传递给的实例的静态方法 - 就像扩展方法一样)被传递到每个对象或由对象实例创建。