C# 重写接口中声明的方法实现

C# 重写接口中声明的方法实现,c#,inheritance,interface,C#,Inheritance,Interface,我有一个接口,里面有几个方法 interface IMyInterface { //... void OnItemClicked() //... } 和一个实现 class MyClass : IMyInterface { //Other methods public void OnItemClicked(){ /*...*/ } } 现在,我想要一个行为类似于MyClass的类,除了OnItemClicked(),我想要对这个方法进行一些修改 我想

我有一个接口,里面有几个方法

interface IMyInterface
{
    //...
    void OnItemClicked()
    //...
}
和一个实现

class MyClass : IMyInterface
{
    //Other methods
    public void OnItemClicked(){ /*...*/ } 
}
现在,我想要一个行为类似于
MyClass
的类,除了
OnItemClicked()
,我想要对这个方法进行一些修改

我想继承一个重写,但我不想更改
MyClass
(比如:public
virtual
void-OnItemClicked()…),因为它不是我的实现

我不想再次实现
IMyInterface
,因为OnItemClicked()是MyClass中唯一需要修改的部分


我还有其他方法吗?

您可以从
MyClass

public class MyNewClass : MyClass
{
    public new void OnItemClicked(){ /*...*/ } //NEW keyword
}
唯一要注意的是,这样你就不会支持多态性

更清楚地说:

     MyClass cl = new MyNewClass(); 
     cl. MyMethod();
这将调用
MyClass
方法,即使实际对象类型是
MyNewType
。 为了能够调用我们想要的,我们必须明确定义类型

     MyNewClass cl = new MyNewClass(); 
     cl. MyMethod(); //WILL CALL METHOD WE WANT

使用模式桥

最简单的方法是使用“has-a”创建一个模仿“is-a”的新类:


因为您正在实现一个接口,所以多态性可能是您希望保留的东西。如果不使用虚函数修改基类,就不可能重写该方法,因此必须使用new而不是Tigran编写的virtual

这意味着编写此类代码,但只执行方法的基本版本:

List<MyClass> aList = new List<MyClass>();
aList.Add(new MyClass());
aList.Add(new MyNewClass());
foreach (MyClass anItem in aList)
    anItem.OnItemClicked();
List<IMyInterface> aList = new List<IMyInterface>();
aList.Add(new MyClass());
aList.Add(new MyNewClass());
foreach (IMyInterface anItem in aList)
    anItem.OnItemClicked();
这样:

 MyClass cl = new MyNewClass(); 
 cl.OnItemClicked();
执行基本方法

 MyNewClass cl = new MyNewClass(); 
 cl.OnItemClicked();
执行派生类的方法

 IMyInterface cl = new MyNewClass(); 
 cl.OnItemClicked();
执行派生类的方法,并在运行时绑定。这意味着您可以像这样编写我的初始示例的代码,并执行正确的方法:

List<MyClass> aList = new List<MyClass>();
aList.Add(new MyClass());
aList.Add(new MyNewClass());
foreach (MyClass anItem in aList)
    anItem.OnItemClicked();
List<IMyInterface> aList = new List<IMyInterface>();
aList.Add(new MyClass());
aList.Add(new MyNewClass());
foreach (IMyInterface anItem in aList)
    anItem.OnItemClicked();
List aList=newlist();
aList.Add(newmyclass());
aList.Add(newmynewclass());
foreach(列表中的IMyInterface anItem)
anItem.OnItemClicked();

在这两者之间创建一个中间类。他在帖子中提到:我想继承一个重写,但我不想更改MyClass(比如:public virtual void OnItemClicked()…),因为它不是我的实现,@armen.shimoon:事实上他没有。你在哪里看到了改变MyClass实现的代码?我糟糕的Tigran。我浏览了一下代码,认为您使用的是“override”而不是“new”。问:当MyNewClass被用作“IMyInterface”的实例时,将调用哪个方法?@armen.shimoon:请看我的帖子示例。此功能不支持多态性。我想接口是多态性的。有道理。我想这取决于他的用法。好的,但是你不能将它分配给MyClass变量是的,但是在答案中,你可以将它分配给MyClass变量,然后调用OnItemClicked(),它将执行错误的函数。我假设界面是重要的部分,否则这将无法正常工作,但另一个答案也不会。你是对的,事实上,我更喜欢你的答案,我只是指出为什么我更喜欢我的答案而不是你的:-)链接消失了。请将这类答案保留为评论
List<IMyInterface> aList = new List<IMyInterface>();
aList.Add(new MyClass());
aList.Add(new MyNewClass());
foreach (IMyInterface anItem in aList)
    anItem.OnItemClicked();