C# 更改默认基类而不是“0”;“对象”;

C# 更改默认基类而不是“0”;“对象”;,c#,visual-studio,compiler-construction,C#,Visual Studio,Compiler Construction,不确定是否不合逻辑,但想学习。如果在创建新类时不声明基类,VisualStudio和编译器都知道它继承了“object”。有没有办法告诉编译器和visual studio(对于intellisense)我的基类不是“object”,而是“myobject”?可能在VisualStudio上有任何配置 你可以说“从‘myobject’继承你所有的类”,我知道,但我只想知道这是可能的。这是不可能的,C的设计方式,一切都源于此。如果不是这样的话,你就不能依赖Object提供的方法,这些方法非常基本/有

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


你可以说“从‘myobject’继承你所有的类”,我知道,但我只想知道这是可能的。

这是不可能的,C的设计方式,一切都源于此。如果不是这样的话,你就不能依赖
Object
提供的方法,这些方法非常基本/有用

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

显然,对于创建的所有类型,您都可以自由地拥有自己的基类,但该基类必须从对象继承(直接或间接)

是否要将方法添加到所有/现有类型?在这种情况下,请使用。

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

public class A : B // A inherits B

但在链的顶端,您仍然可以找到Object,因为无论如何B继承了Object。

不,绝对不是。这是C#规范的一部分,绝不是可选的。根据第10.1.4.1节:

如果类声明没有类基,或者如果类基只列出接口类型,则直接基类被假定为
object

没有特定于实现的摇摆空间-这就是它的方式。就我个人而言,我很高兴——我希望能够在不知道任何项目配置的情况下,仅通过查看源代码就知道direct基类

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

class Foo
{
}
汇编时使用:

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

class Foo : Stream
{
}

这根本不会破坏.NET——这纯粹是一个语言决定。NET强制要求的是,大多数类型最终都至少有一个间接基类
System.Object
。我不认为一种语言可以设计成允许您建立“并行”类型层次结构。

我认为.NET中的所有内容都继承自对象类。例如,由于它,每个对象都有ToString()方法

所有类和结构都来自对象,它是所有类的父类,甚至是从类继承的

public class A : B // A inherits B

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

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

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

请参见

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


但是.Net BCL提供的所有内置类型将无法使用您的
MyObject
类,它们仍然是从object派生的。

这是C#的要求还是.Net的要求?@GeorgeDuckett:这是.Net的要求,链最终将运行到
System.object
(至少我认为是这样)但是,当你声明一个没有指定基类的类型时,由C来决定你的意思。你可以很容易地设计你自己的语言,它有一个不同的默认基类。这绝不会强迫C使用
对象作为默认值。如果你有一个
类MyClass:object
,C可以允许你设置一个默认值,比如t
class Foo
的类声明将等同于
class Foo:MyClass
。这是一个语言决定——也是C#确实执行的决定,但它可以在不改变.NET本身的情况下进行不同的设计。我目前没有投反对票,但我认为这个答案是误导性的或误导性的。@jonsket:乔治·达克特:嗯,有点-但你的第一句话在我看来仍然是误导性的。这在C#中是不可能的(这就是问题所在),因为C#的定义方式,而不是.NET。@乔治·达克特.NET要求所有对象都来自Object”,如果您想要成为默认基类的类是从object派生的,这有什么意义吗?是的,显然.net允许您从一个本身从object派生的类派生(直接派生,或继承链的更高级别)。
//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
}