不确定它是否合乎逻辑但想要学习。如果我们在创建新类时没有声明我们的基类,则visual studio和编译器都知道它继承了“object”。有没有办法告诉编译器和visual studio(对于intellisense)我的基类不是“对象”,例如它是“myobject”?也许是visual studio上的任何配置?
你可以说“从'myobject'继承你所有的课程”,我知道但只是想知道它是否可能。
答案 0 :(得分:9)
如果类声明没有 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
{
}
}
答案 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