1

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

.net 框架如何创建一个类而不继承基对象类但在所有类中都具有虚拟行为?

我们不会这样写

class MyClass : System.Object
{
}

但 MyClass 获得 System.Object 的虚函数。

4

5 回答 5

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

    }
}

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

于 2013-08-11T04:55:20.450 回答
0

A universal base class is the obvious answer to this problem but will not provide the 'standard' implementation for classes that inherit from types outside of your application's class hierarchy.

I would consider composition in place of inheritance. This is the essence of what has been proposed by @ByteBlast and @PhilipScottGivens.

Why not have a helper class that provides the functionality for you GetHashCode and ToString methods (I am picturing some reflection in both of these so that you can work with the members / properties of the instances of your types) and whatever other common services you require for all objects?

An instance of this (or maybe the helper has static methods that you pass an instance to - much like the extension methods) is passed into each object or created by the instance of your object.

于 2013-08-11T06:15:37.867 回答
0

这是一个有趣的问题,但我认为答案是,你不能。如果您不愿意使用通用基类,那么您不能为从object.

如果这对您真的很重要,那么值得考虑基类路线。当然,你不能让它适用于框架类,但在很多情况下它们是密封的(或不可见的)。

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

于 2013-08-11T05:17:43.977 回答
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)
    {
    }
}
于 2013-08-11T05:07:09.017 回答
0

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

于 2013-08-11T05:10:20.593 回答