[设计模式]请问一个继承了基类的子类如果再被继承,如何约束?

yixian2007 2014-06-30 10:30:02
用的VS2012,一个基类A,B继承了A,假如B中的某一个函数也有三种实现方式,该怎么约束继承B的C?

使用接口?还是有什么办法?
...全文
256 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
smthgdin_020 2014-07-01
  • 打赏
  • 举报
回复
引用 10 楼 yixian2007 的回复:
[quote=引用 9 楼 smthgdin 的回复:] [quote=引用 2 楼 yixian2007 的回复:] [quote=引用 1 楼 caozhy 的回复:] 什么叫约束,什么叫“三种实现方式”。这个和设计模式以及VS2012有什么关系。
我的意思是如何约束这三种实现类,都必须完成这个函数。 我在VS2012中,本意是想使用继承的,结果C类继承了B类,B类的该函数使用的是虚函数,但C类编绎的时候没有实现那个函数,就通过了。[/quote] 虚方法,子类可以不用重写,不重写就用父类的那个方法,重写就用子类的方法,编译不会报错。 没法怎么约束,因为基类B已经实现那个方法的话,后面继承的就用基类方法。[/quote] B是派生类,在B这个派生类中,加一个抽象方法,但继承B的C,仍然没有约束。我在VS2012中,确实不重写也是可以通过的。[/quote] 你要明白什么是抽象方法什么是虚方法。看你一会说这个一会说那个。 虚方法,子类可以不重写,抽象方法,子类如果是抽象类,可以不重写,非抽象类就必须重写。
liqiucu 2014-07-01
  • 打赏
  • 举报
回复
A B C有继承关系, B:A, C:B, 如果定义接口IB 让B和C去继承这个接口C就不需要强制实现IB了,也无法满足你的需求,个人觉得你还是把B改称抽象吧,这样才能符合你的需求
liqiucu 2014-07-01
  • 打赏
  • 举报
回复
public abstract class A { public abstract int MyA { get; set; } //... } public abstract class B : A { public override int MyA { get; set; } public abstract void ExtentB() { //... } } public class C : B { public override void ExtentB() { // } }
smthgdin_020 2014-07-01
  • 打赏
  • 举报
回复
interface IA { void test(); } public abstract class B : IA { public void test() { } public abstract void test2(); } class C: B { public override void test2() { } } 这样才能编译通过。
smthgdin_020 2014-07-01
  • 打赏
  • 举报
回复


C不是受到约束了吗?真不知道你要的是啥效果。。。。。
於黾 2014-07-01
  • 打赏
  • 举报
回复
包括使用接口的时候也一样 我使用了接口,定义的参数就必须跟接口中一致 但是方法中我可以不写任何代码,你管得着么
於黾 2014-07-01
  • 打赏
  • 举报
回复
不管是C继承了B还是C引用了B,你都不应该去管C内部实现的时候到底有没有实现B的方法 甚至C引用了B但是根本就没用B中的任何属性和方法,也是被允许的. 我工程中引用了大量的DLL,有些是以前工程COPY过来现在没用了的,我又懒得去挨个删除,难道我就必须把DLL中每个方法都用一用才行?怎么可能呢.
於黾 2014-07-01
  • 打赏
  • 举报
回复
引用 15 楼 yixian2007 的回复:
你说的我明白,抽象方法必须重写。我想问的是如何做才能让C必须实现B这个派生类的某个函数,而不是没有任何约束。
你这个需求很奇葩. 你到底想约束谁,为什么要约束? 刚讨论了接口,现在又想脱离了接口而实现约束?
yixian2007 2014-07-01
  • 打赏
  • 举报
回复
引用 12 楼 smthgdin 的回复:
[quote=引用 10 楼 yixian2007 的回复:] [quote=引用 9 楼 smthgdin 的回复:] [quote=引用 2 楼 yixian2007 的回复:] [quote=引用 1 楼 caozhy 的回复:] 什么叫约束,什么叫“三种实现方式”。这个和设计模式以及VS2012有什么关系。
我的意思是如何约束这三种实现类,都必须完成这个函数。 我在VS2012中,本意是想使用继承的,结果C类继承了B类,B类的该函数使用的是虚函数,但C类编绎的时候没有实现那个函数,就通过了。[/quote] 虚方法,子类可以不用重写,不重写就用父类的那个方法,重写就用子类的方法,编译不会报错。 没法怎么约束,因为基类B已经实现那个方法的话,后面继承的就用基类方法。[/quote] B是派生类,在B这个派生类中,加一个抽象方法,但继承B的C,仍然没有约束。我在VS2012中,确实不重写也是可以通过的。[/quote] 你要明白什么是抽象方法什么是虚方法。看你一会说这个一会说那个。 虚方法,子类可以不重写,抽象方法,子类如果是抽象类,可以不重写,非抽象类就必须重写。[/quote] 你说的我明白,抽象方法必须重写。我想问的是如何做才能让C必须实现B这个派生类的某个函数,而不是没有任何约束。
yixian2007 2014-07-01
  • 打赏
  • 举报
回复
引用 13 楼 sp1234 的回复:
[quote=引用 楼主 yixian2007 的回复:] 用的VS2012,一个基类A,B继承了A,假如B中的某一个函数也有三种实现方式,该怎么约束继承B的C? 使用接口?还是有什么办法?
凭这个理由,根本谈不上应该继承。你就定义C,并且在C的函数中调用B(或者B的实例)的函数即可避免额外编写代码。[/quote] 不是代码,大哥,我是要约束C类必须去实现B类中的方法。怎么约束?
  • 打赏
  • 举报
回复
引用 楼主 yixian2007 的回复:
用的VS2012,一个基类A,B继承了A,假如B中的某一个函数也有三种实现方式,该怎么约束继承B的C? 使用接口?还是有什么办法?
凭这个理由,根本谈不上应该继承。你就定义C,并且在C的函数中调用B(或者B的实例)的函数即可避免额外编写代码。
smthgdin_020 2014-06-30
  • 打赏
  • 举报
回复
引用 2 楼 yixian2007 的回复:
[quote=引用 1 楼 caozhy 的回复:] 什么叫约束,什么叫“三种实现方式”。这个和设计模式以及VS2012有什么关系。
我的意思是如何约束这三种实现类,都必须完成这个函数。 我在VS2012中,本意是想使用继承的,结果C类继承了B类,B类的该函数使用的是虚函数,但C类编绎的时候没有实现那个函数,就通过了。[/quote] 虚方法,子类可以不用重写,不重写就用父类的那个方法,重写就用子类的方法,编译不会报错。 没法怎么约束,因为基类B已经实现那个方法的话,后面继承的就用基类方法。
於黾 2014-06-30
  • 打赏
  • 举报
回复
比如人继承自动物,狗也继承自动物 那么我就不必为他们各自定义一大堆属性,而是使用动物通用的属性去描述他们 并不是说人的类里还要重新定义动物的行为.
於黾 2014-06-30
  • 打赏
  • 举报
回复
引用 2 楼 yixian2007 的回复:
[quote=引用 1 楼 caozhy 的回复:] 什么叫约束,什么叫“三种实现方式”。这个和设计模式以及VS2012有什么关系。
我的意思是如何约束这三种实现类,都必须完成这个函数。 我在VS2012中,本意是想使用继承的,结果C类继承了B类,B类的该函数使用的是虚函数,但C类编绎的时候没有实现那个函数,就通过了。[/quote] B继承A,B可以不实现A中的任何函数,B中可以什么都没有. 接口和继承的概念,你搞混了...
  • 打赏
  • 举报
回复
接口派生一个类后,该类必须完全实现接口的方法。在该类的派生类中就无法约束派生类是否重写父类的方法了。 既然需要C类去继承B类,那么肯定是C类有自己的一些特点或是扩展。为什么要考虑必须重写B类的方法呢?
於黾 2014-06-30
  • 打赏
  • 举报
回复
描述的乱七八糟,概念都混淆在一起...
sunny906 2014-06-30
  • 打赏
  • 举报
回复
除了接口,还可以用抽象方法

    abstract class B 
    {
        public abstract void Method();
    }
    class C : B 
    { 
        public override void Method() 
        { } 
    }
欢乐的小猪 2014-06-30
  • 打赏
  • 举报
回复
抽象方法? abstract?
yixian2007 2014-06-30
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
什么叫约束,什么叫“三种实现方式”。这个和设计模式以及VS2012有什么关系。
我的意思是如何约束这三种实现类,都必须完成这个函数。 我在VS2012中,本意是想使用继承的,结果C类继承了B类,B类的该函数使用的是虚函数,但C类编绎的时候没有实现那个函数,就通过了。
threenewbee 2014-06-30
  • 打赏
  • 举报
回复
什么叫约束,什么叫“三种实现方式”。这个和设计模式以及VS2012有什么关系。
加载更多回复(2)

110,536

社区成员

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

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

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