相关疑难解决方法(0)

新的和覆盖之间的区别

想知道以下几点之间的区别:

案例1:基类

public void DoIt();
Run Code Online (Sandbox Code Playgroud)

案例1:继承的类

public new void DoIt();
Run Code Online (Sandbox Code Playgroud)

案例2:基类

public virtual void DoIt();
Run Code Online (Sandbox Code Playgroud)

案例2:继承的类

public override void DoIt();
Run Code Online (Sandbox Code Playgroud)

根据我运行的测试,情况1和2似乎具有相同的效果.有区别,还是首选方式?

c# inheritance overriding new-operator

179
推荐指数
6
解决办法
7万
查看次数

为什么在派生类中调用方法会调用基类方法?

考虑以下代码:

class Program
{
    static void Main(string[] args)
    {
        Person person = new Teacher();
        person.ShowInfo();
        Console.ReadLine();
    }
}

public class Person
{
    public void ShowInfo()
    {
        Console.WriteLine("I am Person");
    }
}
public class Teacher : Person
{
    public new void ShowInfo()
    {
        Console.WriteLine("I am Teacher");
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,输​​出以下内容:

我是人

但是,你可以看到它是一个实例Teacher,而不是Person.代码为什么这样做?

c# class derived-class

144
推荐指数
4
解决办法
7万
查看次数

覆盖和隐藏之间的确切区别

任何人都可以在内存和引用方面告诉覆盖和隐藏的工作.

class A
{
    public virtual void Test1() { //Impl 1}
    public virtual void Test2() { //Impl 2}
}
class B  : A
{
    public override void Test1() { //Impl 3}
    public new void Test2() { Impl 4}
}

static Main()
{
    A aa=new B() //This will give memory to B
    aa.Test1(); //What happens in terms of memory when this executes
    aa.Test2(); //-----------------------SAME------------------------
}
Run Code Online (Sandbox Code Playgroud)

这里的内存是B类,但在第二个语句中,将调用aa.Test2类A的方法.为什么?如果B有内存,则应调用B的方法(在我看来).

任何非常深刻和完全描述这一基础的链接/练习将是一个很大的帮助.

c# oop overriding member-hiding

16
推荐指数
2
解决办法
2万
查看次数

何时使用new而不是覆盖C#

可能重复:
C#关键字使用情况虚拟+覆盖与新增
新和重写之间的差异?

所以我一直在研究一个项目,并决定阅读C#中关键字newoverride关键字之间的区别.

从我看到的情况来看,似乎使用new关键字功能是在代码中创建错误的好方法.除此之外,我真的不知道何时使用它真的有意义.

更多出于好奇心,有什么模式可以让new关键字成为正确的方法吗?

c# overriding new-operator

13
推荐指数
1
解决办法
2829
查看次数

在C#中使用'new'修饰符

我读到newmodifer隐藏了基类方法.

using System;

class A
{
    public void Y()
    {
        Console.WriteLine("A.Y");
    }
}

class B : A
{
    public new void Y()
    {
        // This method HIDES A.Y.
        // It is only called through the B type reference.
        Console.WriteLine("B.Y");
    }
}

class Program
{
    static void Main()
    {
        A ref1 = new A(); // Different new
        A ref2 = new B(); // Polymorpishm
        B ref3 = new B();

        ref1.Y();
        ref2.Y(); //Produces A.Y line #xx
        ref3.Y();
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么 …

.net c# oop polymorphism new-operator

12
推荐指数
2
解决办法
2480
查看次数

"受保护"和"虚拟/覆盖"之间的区别

我无法理解"受保护"的需要或目的,当我有"虚拟/覆盖"时,有人可以解释我,如果它们几乎相同,我需要这两件事.

编辑:

感谢所有帮助者,我现在明白"受保护"仅用于可见性目的,而虚拟/覆盖用于类行为.

c# oop

9
推荐指数
3
解决办法
2万
查看次数

将调用什么功能?

以前我问过一个问题没有得到充分回答,因此我决定重新制定我的问题以了解发生了什么:

这是我的类层次结构:

interface I
{
    void f();
}

class A : I
{
    // non virtual method
    public void f()
    {
        Debug.Log("---->> A ");
    }
}

class B : A
{
    // non overriding but hiding class A method
    public void f()
    {
        Debug.Log("---->> B ");
    }
}

class C : I
{
    // non virtual method
    public void f()
    {
        Debug.Log("---->> C ");
    }
}
Run Code Online (Sandbox Code Playgroud)

这是执行代码:

Random rnd = new Random();
var randomI = rnd.Next(0, 2);

I i = …
Run Code Online (Sandbox Code Playgroud)

c# interface

9
推荐指数
1
解决办法
260
查看次数

控制器的动作在具有相同名称的基类的动作之间是不明确的.

控制器类型上当前的操作请求'索引'在ContactController以下操作方法之间是不明确的:

System.Web.Mvc.ActionResult Index() on type RX.Web.Controllers.ContactController
System.Web.Mvc.ActionResult Index() on type RX.Web.Controllers.CustomControllerBase2[[RX.Core.Model.Contact, RXTechJob.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] 
Run Code Online (Sandbox Code Playgroud)

联系控制器:

        public virtual new ActionResult Index()
    {
        return base.Index();
    }
Run Code Online (Sandbox Code Playgroud)

基础控制器:

        public virtual ActionResult Index()
    {

        return View("Index", SelectAll());

    }
Run Code Online (Sandbox Code Playgroud)

为什么会这样?怎么解决?谢谢!

c# asp.net-mvc

6
推荐指数
1
解决办法
5831
查看次数

新的和覆盖之间的区别?

我有一个基类,我想为所有继承类的方法提供一些"基础"功能.

在我想继承的继承类中:

public override void Setup()
{
   base.Setup();
}
Run Code Online (Sandbox Code Playgroud)

但目前它说我必须使用new关键字.

我怎么拥有它所以我必须使用override关键字?

目前我使用new关键字和使用它之间有什么区别override吗?

c# overriding

6
推荐指数
1
解决办法
2157
查看次数

什么是新关键字在C#方法的返回类型中的效果?

我实际上写了这个方法:

public static new iTextSharp.text.Color ITextFocusColor()
{
   return new iTextSharp.text.Color(234, 184, 24);
}
Run Code Online (Sandbox Code Playgroud)

它是可疑的,但我很惊讶,它允许在方法的返回类型中使用new关键字.如果我把新的或没有新的,是否有任何影响/差异?或者新用的是什么?

在其他面向对象语言中这也是可能的吗?

c# syntax

5
推荐指数
2
解决办法
403
查看次数