2个类接口实现相同怎样处理合适

aow11 2017-02-16 11:17:54
	public interface ICall
{
void WangWnag();
}
public abstract class Dog
{
protected ICall Call;
}
public class CallImpl : ICall
{
public void WangWnag()
{
throw new NotImplementedException();
}
}
public class JinMao : Dog, ICall
{
public JinMao()
{
Call = new CallImpl();
}
public void WangWnag()
{
Call.WangWnag();
}
}

public class Samo : Dog, ICall
{
public Samo()
{
Call = new CallImpl();
}
public void WangWnag()
{
Call.WangWnag();
}
}


上段代码中 JinMao和 Samo 对 接口ICall的处理是否合适?建议?
...全文
607 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Poopaye 2017-02-18
  • 打赏
  • 举报
回复
不必纠结 要么继承来复用,要么通过复制粘贴来复用 这里的情况用继承是最好的,哪怕后面多了绒毛狗,重写掉相关方法即可。
aow11 2017-02-18
  • 打赏
  • 举报
回复
引用 19 楼 xuzuning 的回复:
接口约束行为,这话对吗? 接口是用于暴露方法,而不是约束行为的 其实大多数人都被二百五的生硬翻译给弄糊涂了
本意是,行为提到接口,类实现接口,接口对类有约束力,避免类对必要行为的遗漏。
xuzuning 2017-02-18
  • 打赏
  • 举报
回复
接口约束行为,这话对吗? 接口是用于暴露方法,而不是约束行为的 其实大多数人都被二百五的生硬翻译给弄糊涂了
Forty2 2017-02-18
  • 打赏
  • 举报
回复
引用 16 楼 aow11 的回复:
... 再加毛绒狗,不需要会叫。
再加’加密狗‘?
aow11 2017-02-18
  • 打赏
  • 举报
回复
引用 16 楼 aow11 的回复:
[quote=引用 4 楼 hanjun0612 的回复:] 我觉得,下面这样就行了
public interface ICall
        {
            void WangWnag();
        }
        public abstract class Dog : ICall
        {
            public virtual void WangWnag()
            {
                Console.WriteLine("通用 Call");
            }
        }

        public class JinMao : Dog
        {

        }

        public class Samo : Dog
        {
            public override void WangWnag()
            {
                Console.WriteLine("Hello World");
            }
        }
再加毛绒狗,不需要会叫。[/quote] ICall约束狗会叫, 对于不叫的狗,是因为它不用叫,而不想做成是叫不出声。
aow11 2017-02-18
  • 打赏
  • 举报
回复
引用 4 楼 hanjun0612 的回复:
我觉得,下面这样就行了
public interface ICall
        {
            void WangWnag();
        }
        public abstract class Dog : ICall
        {
            public virtual void WangWnag()
            {
                Console.WriteLine("通用 Call");
            }
        }

        public class JinMao : Dog
        {

        }

        public class Samo : Dog
        {
            public override void WangWnag()
            {
                Console.WriteLine("Hello World");
            }
        }
再加毛绒狗,不需要会叫。
aow11 2017-02-18
  • 打赏
  • 举报
回复
引用 10 楼 sp1234 的回复:
所有的“诡道”都生成把继承当作组合来用,用各种各样的累人的名字来辩解。 编程设计就是要越简单越好,越少使用类型、接口越好。绝对不是越多罗列雷人的接口和类型越好。所以面相对象设计追求要自然,这不是技术指标,而是务实。我们仅仅在工程上发现需要抽象的时候才分层设计类型或者接口。 我们看看把原本的继承概念诡异地说成是组合,结果会怎么样?起码这根本不是面向对象设计,顶多是是用了OOPL语言来高结构化设计。面向对象的本质并不是“基于对象的”,而是很很好地很自然地处理继承和多态问题。在满足自然而然的抽象时,少写接口和类型。
属性提到基类,接口约束行为, 这很清晰,而且变化方便,同意编码首要是务实。
token不能为空 2017-02-17
  • 打赏
  • 举报
回复
看了7楼觉得比较合理 这种情景还是很多的 就是楼主例子有点不合适,总给人感觉小题大做了
  • 打赏
  • 举报
回复
可能举的例子不太恰当,这里没必要搞这么复杂 不过有些情况下确实需要将CallImpl单独拿出来,此时为了让子类更省事点,可以重载下构造函数 public abstract class Dog { protected Dog() { this.Call = new CallCmpl();} protected Dog(ICall call) { this.Call =call; } protected ICall Call; public virtual void WangWnag() { if(Call != null) Call.WangWnag(); } }
  • 打赏
  • 举报
回复
所有的“诡道”都生成把继承当作组合来用,用各种各样的累人的名字来辩解。 编程设计就是要越简单越好,越少使用类型、接口越好。绝对不是越多罗列雷人的接口和类型越好。所以面相对象设计追求要自然,这不是技术指标,而是务实。我们仅仅在工程上发现需要抽象的时候才分层设计类型或者接口。 我们看看把原本的继承概念诡异地说成是组合,结果会怎么样?起码这根本不是面向对象设计,顶多是是用了OOPL语言来高结构化设计。面向对象的本质并不是“基于对象的”,而是很很好地很自然地处理继承和多态问题。在满足自然而然的抽象时,少写接口和类型。
  • 打赏
  • 举报
回复
一个 Dog 本来就应该“就是”一个 ICall,而不是组合一个 ICall 到它的肚子里。你搞懂了“就是”的含义了吗? 那么 CallImpl 纯粹是多余的东西,是 ICall 的虚幻的假话。删除了它就行了!
  • 打赏
  • 举报
回复
面向对象设计首先要自然,在设计面前,“技术无用”。你的 Dog 不是一个 ICall,而是 Dog 身体里边住着另外一个 ICall,它是蛔虫吗? 比如你说“外国人也是人”,你是说外国人的肚子里住着另外一个人吗? 这里你在滥用接口,所以从 Dog 开始,就是诡道,而非正道。
xdashewan 2017-02-17
  • 打赏
  • 举报
回复
引用 3 楼 hanjun0612 的回复:
dog作为基类应该实现 call作为虚方法, 可是callimpl实现了call确和dog这个基类貌似没有关联。 换句话说,你的jinmao,samo都继承自dog, 但是dog并没有实现call的虚方法。而只是在另一个不相关的类中实现了call
我倒是觉的楼主那个类可以把它看作是“口器”或者说是“发声器”,那么就写成这样

public interface ICall
        {
            void WangWnag();
        }
        public abstract class Dog
        {
            protected ICall Call;
            public virtual void WangWnag()
            {
                if(Call != null)
                       Call.WangWnag();
            }
        }
        public class CallImpl : ICall
        {
               public void WangWnag()
               {
                       throw new NotImplementedException();
               }
        }
        public class JinMao : Dog
        {
                public JinMao()
                {
                         Call = new CallImpl();
                }
        }

        public class Samo : Dog
        {
             public Samo()
             {
                         Call = new CallImpl(); //发声器可以不同
             }
        }
token不能为空 2017-02-17
  • 打赏
  • 举报
回复
金毛是狗,而狗会叫 叫 作为行为是狗应该实现的接口 金毛只要继承狗就可以了 然后再实现自己的叫法 如果你意思是所有狗都汪汪叫,就不需要接口了 狗写一个叫-汪汪方法,金毛和其他狗继承不就可以吗
  • 打赏
  • 举报
回复
你这个明显不对吧,这种相同的可以提取到抽象类里去
正怒月神 2017-02-17
  • 打赏
  • 举报
回复
我觉得,下面这样就行了
public interface ICall
        {
            void WangWnag();
        }
        public abstract class Dog : ICall
        {
            public virtual void WangWnag()
            {
                Console.WriteLine("通用 Call");
            }
        }

        public class JinMao : Dog
        {

        }

        public class Samo : Dog
        {
            public override void WangWnag()
            {
                Console.WriteLine("Hello World");
            }
        }
正怒月神 2017-02-17
  • 打赏
  • 举报
回复
dog作为基类应该实现 call作为虚方法, 可是callimpl实现了call确和dog这个基类貌似没有关联。 换句话说,你的jinmao,samo都继承自dog, 但是dog并没有实现call的虚方法。而只是在另一个不相关的类中实现了call
正怒月神 2017-02-17
  • 打赏
  • 举报
回复
CallImpl 是用来干嘛的?
msdn_duan 2017-02-17
  • 打赏
  • 举报
回复
离子漂浮物 2017-02-17
  • 打赏
  • 举报
回复
以楼主的要求,我的实现方式是4楼那样的。 我实在是想不出CallImpl 的存在意义。
加载更多回复(1)

110,567

社区成员

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

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

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