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
(比如:publicvirtual
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();