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