关于接口的继承的一个问题

w597766166 2011-04-09 01:50:13
直接上代码吧

interface Sample1
{
void say();
}
interface Sample2
{
void say();
}
interface Sample3 : Sample1, Sample2
{
void func3();
}

class B : Sample3
{

}

以上接口Sample3继承自接口Sample1,Sample2
而Sample1,Sample2中有同名的方法say()
则在实现Sample3的类B中应该怎么样才能区别Sample1,Sample2?
或者直接能在Sample3的定义中区别么?
...全文
106 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2011-04-09
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Sample3 b = new B();
b.say();
}
}
interface Sample1
{
void say();
}
interface Sample2
{
void say();
}
interface Sample3 : Sample1, Sample2
{
void say();
void func3();
}
class B : Sample3
{
void Sample1.say() { Console.WriteLine("Sample1.say()"); }
void Sample2.say() { Console.WriteLine("Sample2.say()"); }
public void say() { Console.WriteLine("say()"); }
public void func3() { }
}
}

要么在 Sample3 里面定义 say(),这样这个 say() 会隐藏 Sample1 Sample2 里面的 say()

要么显式将一个 Sample3 类型转换成 Sample1 或者 Sample2:
Sample3 b = new B();
Sample1 b1 = b as Sample1;
b1.say();
兔子-顾问 2011-04-09
  • 打赏
  • 举报
回复

public void Test()
{
Entity e = new Entity();
Sample1 s1 = e as Sample1;
Sample2 s2 = e as Sample2;
s1.say();
s2.say();
e.func3();
}

interface Sample1
{
void say();
}
interface Sample2
{
void say();
}
interface Sample3 : Sample1, Sample2
{
void func3();
}

class Entity : Sample3
{
public void func3()
{
Console.WriteLine("fun3");
}

public void say()
{
Console.WriteLine("say");
}
}


接口关键是描述行为和属性。比如你有2个接口:
interface IFlyable
{
void GetReady();
void Fly();
}

interface ITravelable
{
void GetReady();
void Run
}

都具有做好准备的方法,那么,按照面向对象的设计,你是可以忽略细节,直接调用GetReady的,当然,如果你为了区分Fly的准备和Travel的准备,可以将2个接口显示实现。MSDN上写不推荐显示实现接口,因为其子类无法继承这个接口的实现。

或许,你可以将类这样设计:

public void Test()
{
Entity e = new Entity(new Entity1(), new Entity2());
e.S1.say();
e.S2.say();
e.func3();
}

interface Sample1
{
void say();
}
interface Sample2
{
void say();
}

interface Sample3
{
void func3();
}

public class Entity1 : Sample1
{
public void say() { Console.WriteLine("sample1.say");}
}

public class Entity2 : Sample2
{
public void say() { Console.WriteLine("sample1.say"); }
}

class Entity : Sample3
{

public Sample1 S1;
public Sample2 S2;

public Entity(Sample1 s1,Sample2 s2)
{
this.S1 =s1;
this.S2 = s2;
}

public void func3()
{
Console.WriteLine("fun3");
}
}
pennygiser 2011-04-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 w597766166 的回复:]
直接上代码吧

C# code

interface Sample1
{
void say();
}
interface Sample2
{
void say();
}
interface Sample3 : Sample1, Sample2
{
void f……
[/Quote]





w597766166 2011-04-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 caozhy 的回复:]
使用显式的实现:
C# code
interface Sample1
{
void say();
}
interface Sample2
{
void say();
}
interface Sample3 : Sample1, Sample2
{
void func3();
}
class B : Sample3
{
public void Sample1.sa……
[/Quote]

还有个问题就是,如果我想
Sample3 s3 = new B();
而直接 s3.say()显然是不行的

那如果再Sample3的接口定义中区分不同的继承的呢?
threenewbee 2011-04-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 taomanman 的回复:]
这里需要注意的一点,如果多个接口中有同名的方法的话,那么在具体的子类实现过程中同名的方法需要加上接口名称来区分,且不要用public来修饰,非同名的方法必须用public修饰。
[/Quote]
正确。
修正下我的代码:


interface Sample1
{
void say();
}
interface Sample2
{
void say();
}
interface Sample3 : Sample1, Sample2
{
void func3();
}
class B : Sample3
{
void Sample1.say() { Console.WriteLine("Sample1.say()"); }
void Sample2.say() { Console.WriteLine("Sample2.say()"); }
public void func3() { }
}
w597766166 2011-04-09
  • 打赏
  • 举报
回复
果然是C#的人多啊 在python区问一个问题 至少半天才会有一个人回帖~~~~
Peter200694013 2011-04-09
  • 打赏
  • 举报
回复
通过显示接口实现解决命名冲突
暖枫无敌 2011-04-09
  • 打赏
  • 举报
回复
这里需要注意的一点,如果多个接口中有同名的方法的话,那么在具体的子类实现过程中同名的方法需要加上接口名称来区分,且不要用public来修饰,非同名的方法必须用public修饰。
暖枫无敌 2011-04-09
  • 打赏
  • 举报
回复
通过接口名称来区分啊

interface Sample1
{
void say();
}
interface Sample2
{
void say();
}
interface Sample3 : Sample1, Sample2
{
void func3();
}

class B : Sample3
{
void Sample1.say()
{
Console.WriteLine("接口1中的方法");
}

void Sample2.say()
{
Console.WriteLine("接口2中的方法");
}

public void func3()
{
Console.WriteLine("接口3中的方法");
}
}

wangjunwoman 2011-04-09
  • 打赏
  • 举报
回复
同上内容
threenewbee 2011-04-09
  • 打赏
  • 举报
回复
使用显式的实现:
interface Sample1
{
void say();
}
interface Sample2
{
void say();
}
interface Sample3 : Sample1, Sample2
{
void func3();
}
class B : Sample3
{
public void Sample1.say() { Console.WriteLine("Sample1.say()"); }
public void Sample2.say() { Console.WriteLine("Sample2.say()"); }
public void func3() { ... }
}
调用:
Sample1 s = new class B();
s.say(); // 调用的是 sample1.say
Sample2 s2 = s as Sample2;
s2.say(); // 调用的是 sample2.say

另外,不要用“接口继承”这样的说法,应该是“接口实现”。
在C#里,继承和实现都是用 : 号,在Java里面虽然繁琐,但是意思明白,继承是extends,实现是implements。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧