更改默认基类而不是“对象”

时间:2011-11-17 11:15:02

标签: c# visual-studio compiler-construction

不确定它是否合乎逻辑但想要学习。如果我们在创建新类时没有声明我们的基类,则visual studio和编译器都知道它继承了“object”。有没有办法告诉编译器和visual studio(对于intellisense)我的基类不是“对象”,例如它是“myobject”?也许是visual studio上的任何配置?

你可以说“从'myobject'继承你所有的课程”,我知道但只是想知道它是否可能。

7 个答案:

答案 0 :(得分:9)

不,绝对没有。这是C#规范的一部分,绝不是可选的。从10.1.4.1节:

  

如果类声明没有 class-base ,或者 class-base 仅列出接口类型,则假定直接基类为{{1} }。

没有特定于实现的摆动室 - 这就是它的方式。就个人而言,我很高兴 - 我希望能够通过查看源代码来告诉直接基类,而不需要知道任何项目配置。

编辑:为了清楚起见,C#可以设计为可以指定不同的类型作为基本类型。例如,我可以想象(但不喜欢)一种语言:

object

编译:

class Foo
{
}

相当于:

csc /evil:DefaultBaseClass=System.IO.Stream Foo.cs

这根本不会破坏.NET - 这是一个纯粹的语言决定。 .NET强制执行的,大多数类型最终都使用至少是class Foo : Stream { } 的间接基类。我不认为某种语言可以设计为允许您设置“并行”类型层次结构。

答案 1 :(得分:8)

这是不可能的,C#的设计方式,(almost)一切都来自Object。如果不是这种情况,你就不能依赖Object提供的方法,这些方法非常基础/有用。

请注意,.Net要求所有对象都来自Object(直接或间接)。 C#指定声明没有基类的对象继承自Object,其他语言可以自由指定另一种类型,但是该类型必须根据.net要求从Object继承(直接或间接)。

显然,您可以为您创建的所有类型自由创建基类,但是该基类必须从对象(直接或间接)继承。

是否要为所有/现有类型添加方法?在这种情况下使用extension methods

答案 2 :(得分:2)

您可以修改现有项目模板(或创建一个新模板),以便新类自动从某个基类继承:

using System;
using System.Collections.Generic;
$if$ ($targetframeworkversion$ >= 3.5)using System.Linq;
$endif$using System.Text;

namespace $rootnamespace$
{
    class $safeitemrootname$ : SomeBaseClass
    {
    }
}

请参阅Customizing Project and Item Templates

答案 3 :(得分:1)

您可以创建自己的自定义抽象类,并覆盖Object类定义的4个方法,并进一步向您的自定义基类添加新的虚拟和抽象方法。然后,您可以将此类显式用作所有其他自定义类的基类。但是,这仍然意味着所有类的超级基类将只是对象(你不能改变它)。 e.g。

//your custom base class
public abstract class MyObject
{
    public virtual void MyCustomMethod()
    {
        //Your custom method implementation
    }

    public abstract void MyCustomAbstractMethod();        

    public override string ToString( )
    {
       //your custom implementation for override
    }

    public override string Equals( )
    {
        //your custom implementation for override
    }

    public override string GetHashCode( )
    {
        //your custom implementation for override
    }

    public override string GetType( )
    {
        //your custom implementation for override
    }
}

//your custom child class
public class CustomClass1 : MyObject //still derived from object
{
    //implement and override the MyObject and object methods
}

//your custom child class
public class CustomClass2 : MyObject //still derived from object
{
    //implement and override the MyObject and object methods
}

但.Net BCL提供的所有内置类型都无法使用您的MyObject类,但它们仍然会从对象中派生出来。

答案 4 :(得分:0)

好的一件事:在C#和Java中,声明的所有类都是从Object自动派生的。没有改变这一点。 Object是类层次结构的根。现在,您可以让您的类继承另一个类,如:

public class A : B // A inherits B

但在链上方,你仍会在顶部找到Object,因为无论如何B都继承了Object。

答案 5 :(得分:0)

我认为.NET中的每一件事都继承自对象类。 4例子,因为它,每个对象都有ToString()方法。

答案 6 :(得分:0)

所有的类和结构继承自Object,它是所有类的父类,即使你从类中继承了

public class A : B // A inherits B