举个例子!
小学生:打乒乓、踢足球、打篮球、过家家
中学生:打乒乓、踢足球、打篮球、谈恋爱继承关系如下:
学生
{
打乒乓、踢足球、打篮球
}
小学生:学生
{
过家家
}
中学生:学生
{
谈恋爱
}父类学生中:打乒乓、踢足球、打篮球三个函数的代码和小学生、中学生是一样的。
这种情况是应该用接口还是类?
用接口的话,对于多层架构来说比较好,但是代码又是一样的,觉得很浪费。
小学生:打乒乓、踢足球、打篮球、过家家
中学生:打乒乓、踢足球、打篮球、谈恋爱继承关系如下:
学生
{
打乒乓、踢足球、打篮球
}
小学生:学生
{
过家家
}
中学生:学生
{
谈恋爱
}父类学生中:打乒乓、踢足球、打篮球三个函数的代码和小学生、中学生是一样的。
这种情况是应该用接口还是类?
用接口的话,对于多层架构来说比较好,但是代码又是一样的,觉得很浪费。
如果遇到多重继承的时候,你就不得不使用接口。因为.net是不支持多重继承的。除此以外,不必太在意是用接口还是类。当你写成学生类,但是发现其它地方又需要学生接口,也没有关系。如果一定需要学生类也具有学生接口,直接给学生类声明上使用学生接口的定义然后重新编译就可以了,学生类和学生接口并不冲突。
namespace my
{
interface 行为
{
void 吃();
void 睡();
}
abstract class 动物 : 行为
{
public virtual void 吃()
{
Console.WriteLine("我们的动物是会吃的,不是玩具!");
}
public virtual void 睡()
{
Console.WriteLine("我们的动物是会睡的,不是玩具!");
}
}
class 猴子 : 动物
{
public override void 睡()
{
Console.WriteLine("我是一只猴子所以要在树上睡!");
}
public void 跳()
{
Console.WriteLine("我是一只猴子所以要跳来跳去的!");
}
}
class myClass
{
public static void Main()
{
//关键就是这里,请问能用接口来实例化类吗?
//比如:行为 i = new new 猴子();
猴子 b = new 猴子();
b. 睡();
b. 吃();
b. 跳();
}
}
}
{
void eat();
}
class dog:if
{
public void eat()
{
//吃东西
}
}那么可以:
if i = new dog();
i.eat();如果用抽象类+接口的话: interface if
{
void eat();
}
class abstract animal : if
{
public void eat()
{
//吃东西
}
} class dog : animal
{
public void drink()
{
//喝东西
}
}这个时候怎么写?下面这样还可以吗?
if i = new dog();
i.eat();
i.drink();
貌似不可以了吧!??如果我想让别人通过接口来访问的话,应该怎么办?谢谢sp1234
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Threading;namespace ConsoleApplication1
{
interface IStudent
{
void think();
} abstract class animal
{
public void drink()
{
Console.WriteLine("drink");
} public void eta()
{
Console.WriteLine("eta");
}
} class dog : animal
{
public void fuck()
{
Console.WriteLine("fuck");
}
} class Csdn用户 : animal, IStudent
{ public void think()
{
Console.WriteLine("think");
}
} public class test
{
static void Main()
{
animal x = new Csdn用户();
x.drink();
Console.ReadKey();
}
}
}
这里你才可以给别人一个animal让他去执行dring方法。
{
static void Main()
{
animal x = new Csdn用户();
x.drink();
IStudent y = (IStudent)x;
y.think();
Console.ReadKey();
}
}
呵呵
use one way do one thing
sorry,其实这段回复是说给楼主听的,他需要根据自己的情况作出抉择,但是知道一些基本的原则是对做出抉择很有帮助的。
中学生:打乒乓、踢足球、打篮球、谈恋爱 这个先要做一个基本判断:
[1]小学生与中学生之间是否有依赖关系
[2]打乒乓、踢足球、打篮球、过家家、谈恋爱,这些动作之间是否有依赖元素存在
[2-1]打乒乓、踢足球、打篮球之间是否有依赖元素存在就这个CASE而言,没有其它附属条件被表达,
最好是采用集口,如果动作之间是无关的,最好是采用最小单位的接口
3+1+1个接口
打乒乓、踢足球、打篮球之间有关系的
2+1+1个接口如果动作本身是有演化关系的,
比如小学“会踢”,中学一定“会踢”,
那么可以采用:
抽象基本+接口实现的方式考虑两个原则:
这些动作是否还可以细分,
如果可以细分,有没有共同属性,
接口的粒度
接口也要考虑继承关系
哪些动用是虚的,哪些是实的,要进行比较,
是否将来会有新的要素加入,比如性别,年令。总之:
主要是判断依赖倒置的原则,在这个CASE中是否存在,
然后判断是否采用接口的实现方案
难得sp1234今天说的这么多,楼主有福啊~