Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 重载、重写和隐藏?_.net_Oop - Fatal编程技术网

.net 重载、重写和隐藏?

.net 重载、重写和隐藏?,.net,oop,.net,Oop,谁能解释一下.Net中的重载、重写和隐藏是什么 谢谢当您创建多个具有不同参数的方法时,会出现重载。例如: public class Car { public Car() { // Do stuff } public Car(int numberOfCylinders) { // Do stuff } } 公车 { 公共汽车 { //做事 } 公共汽车(国际气缸数) { //做事 } } 您可以看到构造函数具有相同的名称,但参数不同。您将在Intellis

谁能解释一下.Net中的重载、重写和隐藏是什么


谢谢

当您创建多个具有不同参数的方法时,会出现重载。例如:

public class Car { public Car() { // Do stuff } public Car(int numberOfCylinders) { // Do stuff } } 公车 { 公共汽车 { //做事 } 公共汽车(国际气缸数) { //做事 } } 您可以看到构造函数具有相同的名称,但参数不同。您将在Intellisense中的VisualStudio中看到重载的方法和构造函数,上面和下面都有小箭头,因此您可以浏览签名

重写是指从基类向方法提供新的实现。例如:

public class Square { public double x; // Constructor: public Square(double x) { this.x = x; } public virtual double Area() { return x*x; } } class Cube: Square { // Constructor: public Cube(double x): base(x) { } // Calling the Area base method: public override double Area() { return (6*(base.Area())); } } 公共课广场 { 公共双x; //建造商: 公共广场(双x) { 这个.x=x; } 公共虚拟双区() { 返回x*x; } } 类立方体:正方形 { //建造商: 公共立方体(双x):底部(x) { } //调用区域基方法: 公共覆盖双区域() { 返回(6*(base.Area()); } }
请注意,在C#中,不能使用非虚拟或静态方法。

重载提供了具有相同名称和不同签名的多个方法:

void Foo() {...}
void Foo(int i) {...}
重写在继承中用于更改每个子类的实现:

class SomeBase {
    public virtual void Foo() {}
}
class SomeOther : SomeBase {
    public override void Foo() {
        // different implementation, possibly calling base.Foo();
    }
}
在上述情况下,即使我这样做:

SomeBase obj = new SomeOther();
obj.Foo();
它将调用
SomeOther.Foo
实现。调用的方法取决于实例的类型,而不是变量

方法隐藏则相反;它将替换方法签名,但仅在从派生类型调用方法时适用:

class SomeBase {
    public void Foo() {}
}
class SomeOther : SomeBase {
    public new void Foo() {
        // different implementation, possibly calling base.Foo();
    }
}
现在:


i、 e.方法调用取决于变量,而不是实例。

重载是对单个方法或运算符的多个可能“签名”的定义。每个签名接受不同的参数,本质上是一个不同的函数,与多个函数具有不同的名称没有区别。这通常用于对概念上相似的操作进行分组,例如重载
+
以处理
biginger
String
:这两种操作似乎都可以使用
+
进行(除非您认为+的所有重载都应该定义--
字符串
重载没有定义)

覆盖是对同一方法签名的多个可能实现的定义,因此实现由第0个参数的运行时类型决定(通常由C#中的名称
this
标识)

隐藏是派生类型中的方法定义,其签名与其基类型中的签名相同,而不重写

覆盖和隐藏的实际区别如下:

  • 如果重写了某个方法,则要调用的实现将基于参数this的运行时类型
  • 如果只是隐藏了一个方法,那么要调用的实现将基于参数this的编译时类型
简单来说:

重载是指具有不同签名的相同方法名。这可以在同一个类中。例如:

int Add (int a, int b)
{
  return a + b; // returns int
}
float Add (float a, float b)
{
return a + b; // returns float
}
重写是指派生类中的方法名和签名与基类中的方法名和签名相同。在这种情况下,我们说派生类重写基类方法。运行哪个方法取决于哪个实例调用该方法

e、 g

隐藏或封装是当您声明一个类的成员变量和方法为私有时,使它们不能被任何其他类访问,甚至不能被派生类访问

例如


重载是poly-morpsm的一个示例,可以在两个方法之间传递参数的编号、数据类型和序列

覆盖(与虚拟不同)意味着存在一些已定义的功能,但您可以在继承时给出更清晰的概念

隐藏是指隐藏内部特征并表示本质特征,这是面向对象设计概念的特征之一


谷歌获取详细信息假定您理解其他海报给出的解释,记住重载和重写之间区别的一种方法是,当使用overloading时,可能会有同名函数的“load


愚蠢,我知道,但它对我有用。

可能重复注意,在C#中,您不能重写非虚拟或静态方法。您的意思是静态方法不会被继承?您的意思是?方法重写:虚(在基中)+重写(在派生中),方法隐藏:{nothing}(在基中)+new(在派生中)这不是在此上下文中隐藏的。@完美主义者,它仍然在隐藏
int Add (int a, int b)
{
  return a + b; // returns int
}
float Add (float a, float b)
{
return a + b; // returns float
}
public class Shape
    {
        public virtual void Draw() { }

    }

    public class Square : Shape
    {
        public override void Draw()
        {
            // Code to draw square
        }
    }

    public class Circle : Shape
    {
        public override void Draw()
        {
            // Code to draw circle
        }
    }
private int onlyICanAccess;

private void OnlyICanExecute()
{
  // ...
}