小编Vik*_*ram的帖子

C#接口继承到抽象类

假设我有一个如下定义的接口:

public interface IFunctionality
{
    void Method();       
}
Run Code Online (Sandbox Code Playgroud)

我为抽象类实现了这个接口,如下所示:

public abstract class AbstractFunctionality: IFunctionality
{
    public void Method()
    {
        Console.WriteLine("Abstract stuff" + "\n");
    }       
}
Run Code Online (Sandbox Code Playgroud)

我还有一个具体的类,它继承自抽象类,如下所示:

public class ConcreteFunctionality: AbstractFunctionality
{
    public void Method()
    {
        Console.WriteLine("Concrete stuff" + "\n");
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我有以下代码,

ConcreteFunctionality mostDerived = new ConcreteFunctionality();
AbstractFunctionality baseInst = mostDerived;
IFunctionality interfaceInst = mostDerived;
mostDerived.Method();
baseInst.Method();
interfaceInst.Method();
Run Code Online (Sandbox Code Playgroud)

执行这些东西后我得到的输出如下.

Concrete stuff
Abstract stuff
Abstract stuff
Run Code Online (Sandbox Code Playgroud)

但是我一直期望输出在所有三种情况下都是"混凝土东西",因为我在这里做的是分配ConcreteFunctionality类型AbstractFunctionality和变量的引用IFunctionality.

内部发生了什么.请澄清一下.

c# oop abstract-class interface concrete

50
推荐指数
3
解决办法
2132
查看次数

为什么在添加到集合时不会为所有对象调用Equals()

我有一个类型,我在IDictionary中使用它作为键.类型如下

public  class Employee
{
    public string Name { get; set; }
    public int ID { get; set; }

    public override bool Equals(object obj)
    {
        Employee emp = obj as Employee;
        if (emp != null)
            return emp.Name.Equals(this.Name);
        return false;
    }

    public override int GetHashCode()
    {
        return this.Name.GetHashCode();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我已经在我的主要内容中创建了一个字典,如下所示

 IDictionary<Employee, int> empCollection = new Dictionary<Employee, int>();
        Employee emp1 = new Employee() { Name = "abhi", ID = 1 };
        Employee emp2 = new Employee() { Name = "vikram", ID …
Run Code Online (Sandbox Code Playgroud)

.net c# collections

12
推荐指数
1
解决办法
793
查看次数

工厂类不支持SOLID原则

我的代码如下所示

 public interface ICar
{
    void Created();
}

public class BigCar : ICar
{
    public void Created()
    {

    }
}

public class SmallCar : ICar
{
    public void Created()
    {

    }
}


public class LuxaryCar : ICar
{
    public void Created()
    {

    }
}

public class CarFactory
{
    public ICar CreateCar(int carType)
    {
        switch (carType)
        {
            case 0:
                return new BigCar();
            case 1:
                return new SmallCar();
            case 2:
                return new LuxaryCar();
            default:
                break;
        }
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

在这段代码中,我有一个返回具体实例的工厂.但每次我需要有一个新的ICar接口实现时,我必须更改CarFactory的CreateCar()方法.我似乎不支持SOLID原则的开放封闭原则.请建议有更好的方法来处理这种情况.

c# oop design-patterns solid-principles

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

将 Microsoft.Office.Interop.Excel.Application 转换为 byte[]

我在代码中创建了一个excel文件,如下所示

 Microsoft.Office.Interop.Excel.Application excelFile = CreateExcelFile();
Run Code Online (Sandbox Code Playgroud)

现在我想将此 excelFile 转换为 byte[] 而不保存到硬盘驱动器。这怎么可能?

c# interop

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

如何在父控件中处理子事件

在我的主窗口中,我有一个包含文本框的子控件(用户控件).如何在main(父)窗口中处理子控件文本框的textchange事件.

请给我一些代码示例,因为我是事件路由的新手.

wpf events routing event-handling event-bubbling

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

如何将搜索到的项目滚动到 Wpf 中的 GridView 视图中

作为对这个问题的参考,我想知道如何将搜索到的项目滚动到网格视图的视图中

.net c# wpf

4
推荐指数
1
解决办法
619
查看次数

Backgroundworker的RunWorkerCompleted事件甚至在完成工作之前就开始了

我使用BackgroundWorker线程执行一个长任务(基本上读取一个大的xml文件).工作人员第一次按照需要正常工作,但如果我上传第二个xml文件,使用相同的后台工作程序,它有时可以正常工作,但大多数情况下,即使在DoWork事件之前,BackgroundWorker的RunWorkerCompleted也会被触发.部分代码显示如下

    private void openFile_Click(object sender, RoutedEventArgs e)
    {
          // Code removed for brevity
  worker = new BackgroundWorker();
            worker.RunWorkerAsync();
            worker.DoWork += new DoWorkEventHandler(worker_DoWork);
            worker.WorkerReportsProgress = true;
            worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
            worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
       }

        void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        DataImport();
        //worker.Dispose();
        //worker.Disposed += new EventHandler(worker_Disposed);
        //worker.DoWork -= worker_DoWork;
        //worker.RunWorkerCompleted -= worker_RunWorkerCompleted;
        //worker = null;
        //GC.Collect(GC.GetGeneration(worker), GCCollectionMode.Forced);
    }
Run Code Online (Sandbox Code Playgroud)

worker是全局定义的变量.这里有什么问题我没有得到.请帮助

.net c# wpf backgroundworker

2
推荐指数
1
解决办法
8821
查看次数

INotifyCollectionChanged未更新UI

我有一个课程,如下所示.为简洁起见,我删除了所有功能

public class PersonCollection:IList<Person>
{}
Run Code Online (Sandbox Code Playgroud)

现在我还有一个Model类,如下所示.AddValueCommand是从ICommand派生的类,我再次忽略了它.

public class DataContextClass:INotifyCollectionChanged
{
    private PersonCollection personCollection = PersonCollection.GetInstance();

    public IList<Person> ListOfPerson
    {
        get 
        {
            return personCollection;
        }            
    }

    public void AddPerson(Person person)
    {
        personCollection.Add(person);
        OnCollectionChanged(NotifyCollectionChangedAction.Reset);
    }


    public event NotifyCollectionChangedEventHandler CollectionChanged = delegate { };
    public void OnCollectionChanged(NotifyCollectionChangedAction action)
    {
        if (CollectionChanged != null)
        {
            CollectionChanged(this, new NotifyCollectionChangedEventArgs(action));
        }
    }       

    ICommand addValueCommand;

    public ICommand AddValueCommand
    {
        get
        {
            if (addValueCommand == null)
            {
                addValueCommand = new AddValueCommand(p => this.AddPerson(new Person { Name = "Ashish"})); …
Run Code Online (Sandbox Code Playgroud)

c# wpf inotifycollectionchanged

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

为什么实例变量的值会根据函数值进行更改

我上课了.我有两个实例成员变量x和y,并且该类还有一个函数,它再次接受两个名为x和y的变量.

public class MyClass
{
    public int x;
    public int y;

    public int Add(int x , int y)
    {
        return (x + y);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我正在创建类的实例并将值分配给实例变量.如果我使用相同的实例调用该函数,则实例变量的值将更改为我作为参数传递给函数的值,如图所示下面

        MyClass abs = new MyClass();
        abs.x = 10;
        abs.y = 11;
        Console.WriteLine(abs.Add(12, 13).ToString());
Run Code Online (Sandbox Code Playgroud)

调试时我发现实例变量的值分别变为12和13.为什么会这样?究竟发生了什么.

.net c# oop

-1
推荐指数
1
解决办法
64
查看次数