如何让我的所有类都具有默认功能,如.ToString方法

本文关键字:默认 功能 方法 ToString 我的 | 更新日期: 2023-09-27 18:27:23

我想让我的所有类都有一套行为,就像.net中的所有类一样(ToString、GetHashCode等)。但我不想创建一个具有这些类型函数的基类,并从这个基类继承所有的类。通过这种方式,我将失去从任何其他类继承我的类的自由(因为.net只支持从一个类继承)。

net框架如何创建一个类而不从基对象类派生,但在所有类中都具有虚拟行为?

我们不会这样写

class MyClass : System.Object
{
}

但是MyClass获取System.Object.

如何让我的所有类都具有默认功能,如.ToString方法

的虚拟函数

您不必显式声明您的类继承自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)
    {
    }
}

您可以更明确地定义一个类可以实现的接口,然后定义该接口的扩展方法。因为可以实现的接口数量没有限制,所以这可能会减轻您对多重继承的担忧。

要在ByteBlast的帖子基础上构建并解决harpo的问题,可以使用带有扩展方法的decorator接口。

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)
    {
    }
}

也许你想做的事情可以用PostSharp完成?本质上,让该工具用自定义类的继承替换从System.Object继承的所有类?

这是一个有趣的问题,但我认为答案是,你不能。如果您不愿意使用通用基类,那么就不能为从object继承的方法提供通用行为。

如果这对你来说真的很重要,那么值得考虑基类路由。当然,您不能将其应用于框架类,但在许多情况下,这些类都是密封的(或不可见的)。

我一直在思考这个问题,因为我正在处理一些类,这些类除了为具有值类型语义的类提供GetHashCodeEquals重写之外什么都不做。在某些情况下,使用备用基类会非常方便,但您根本无法通过任何其他方式(例如接口/扩展方法)覆盖这些行为。

通用基类是这个问题的明显答案,但不会为从应用程序类层次结构之外的类型继承的类提供"标准"实现。

我会考虑用组合代替继承。这就是@ByteBlast和@PhilipScottGivens提出的建议的精髓。

为什么不提供一个助手类来为GetHashCodeToString方法提供功能(我在这两个方法中都画了一些反射,以便您可以使用类型实例的成员/属性)以及所有对象所需的任何其他公共服务?

它的一个实例(或者帮助器有静态方法,您可以将实例传递给这些方法,就像扩展方法一样)被传递到每个对象中,或者由对象的实例创建。