将接口扩展为抽象类

sok*_*sok 19 c# oop

我有一个接口(移动)应该移动一些形状.

interface Move { move(); }
abstract class Shape : Move

class Circle : Shape
class Square : Shape
class Triangle : Shape
Run Code Online (Sandbox Code Playgroud)

我的疑问是,我必须有一个移动Shapes的界面,但是只能移动Circle和Triangle,那么我如何从Square"移除"界面?我应该从Shape中删除界面并在Circle和Triangle上手动添加它吗?我有点困惑.希望有人可以帮助我.

Mik*_*oud 34

你应该像这样设置你的类:

interface IMovable { move(); } 
abstract class Shape : { } 

class Circle : Shape, IMovable { } 
class Square : Shape { } 
class Triangle : Shape, IMovable { } 
Run Code Online (Sandbox Code Playgroud)

如果不能移动每个形状,则Shape不得实现接口.另请注意,我将您的界面重命名为IMovable,这不是一个大问题,但它更受欢迎,更好的命名约定.

  • 这个."如何取消继承某些基本行为"这一问题的答案始终是"首先不要从中继承". (4认同)
  • @Mike,"IMovable"怎么样? (4认同)

Ode*_*ded 27

您无法从继承树中删除接口.

你的模型似乎需要两个抽象类 - ShapeMovableShape.

interface IMove { move(); } 
abstract class Shape : {} 
abstract class MovableShape : IMove, Shape {} 

class Circle : MovableShape{}
class Square : Shape{}
class Triangle : MovableShape{}
Run Code Online (Sandbox Code Playgroud)

  • @NadirSampaoli,你是__opinion__正确地注意到,但要小心,因为这会变成一个非常主观的对话.有一点需要注意的是__I + 1这个答案也是因为它非常正确. (3认同)
  • @Mike我道歉,事实上我的评论听起来很大胆; 我应该附上"在我看来". (3认同)
  • +1 @Mike - 两个答案都是_correct_.哪一个更适合OP?问题中没有足够的信息可以确定答案. (2认同)
  • @Mike - 谈到声誉,我不能过多评论,只是说它在日常生活中与我无关.社区很重要,并试图培养它,而不是将网站视为"竞争"是正确的.(顺便说一句 - 有[体育精神徽章](http://stackoverflow.com/badges/805/sportsmanship)鼓励社区思考). (2认同)
  • @NadirSampaoli关于Mike和Oded的讨论,我认为Nadir应该给Mikes回复一个合理的答案,而不是在火焰中爆发(这通常发生在我猜中). (2认同)