JBTALKS.CC
标题:
interface的不解
[打印本页]
作者:
my_world
时间:
2010-6-23 02:43 PM
标题:
interface的不解
我好像在这里看过关于interface的讨论,但现在却找不到那帖了。
对于这interface我还是一知半解,可能一半都没有。
看过了好多关于interface的解释,但都不能领悟到关键要怎么用和在什么情况适合用interface。
每次看到的都放在class里,并只是用于普通的set 和get。
那位大哥可以解释吗?
十分,非常,真心的感谢!
作者:
宅男-兜着走
时间:
2010-6-23 06:46 PM
回复
1#
my_world
这帖好 @@。。。
上次那个帖是我开的。 不过现在是懂怎么用, 但是什么情况下真正会用到还不是很清楚。
帮你顶下, 顺便Share 你我知道的地方。
就可能, 也许可能。
比如说, 你有这样的 Class:
Invoice , PurchaseOrder 还是什么。
你需要计算他们的 Total Amount。
*假设 Purchase Order / Invoice 两个的算法不一样。
你有两种做法, 你可以有个 Super , 继承 Invoice, PO, 然后Abstract 的 method
CalculateTotalAmount();
可是万一有天 除了, Invoice , Purchase Order 的单据需要 CalculateTotalAmount() , 可是他们不能继承Super, 因为Field, Properties 可能不一样。
那么Interface 就是最好的方法。
比如 : ICalculate
让那些需要CalculateTotalAmount 的 Class 来Implement。
*献丑了 *.*....
作者:
宅男-兜着走
时间:
2010-6-23 06:48 PM
回复
1#
my_world
http://www.dofactory.com/Patterns/Patterns.aspx
看看这贴吧。 有些设计模式。 可是我到现在还是不明白为什么需要那么用。
作者:
~Zero
时间:
2010-6-23 09:57 PM
我不说实际上怎么 code (自己去学).
我来说说一个比喻上的实际用途.
大家应该都会有玩过类似这样的 RPG 吧,
游戏里面会有很多 class, 例如 warrior, magician, archer 等等.
然后每个人都会有自己的 Attack, Skill, Run.
游戏的 code 里面, 都会用到 A.Attack, B.Attack, 所以这时候如果 A 或 B 的 class 里面没有 Attack 这个 function 的话不行.
这时候, 如果说做一个 Abstract class 叫 CharacterClass 然后用 3 个来 inherit 的话, 又不太对的样子 (因为 3 个都继承同一个 Attack, 然后还要设计自己的 Attack 方式来 overload? 不是多此一举吗?);
这时候, 最好的方法就是写一个 interface, 叫 ICharacter, 里面 define 一定要有的 functions (Attack, Skill, Run), 然后写 3 个 class 来 implement.
作者:
my_world
时间:
2010-6-23 11:33 PM
回复
4#
~Zero
那么照这例子来说的话,现在已经有3个class了。
Warrior A
Magician B
Archer C
这Icharacter里也defined3个不同的functions,然后写3个不同的class来implement。。
如果我用一个class来implement全部的话也能的,对吧?
还想知道的是 -〉 如果用3个不同的class来做Attack , skill, run. 所以a或b或c要用时都会是个普通的attack,skill和run吧。对吗?
如果个自有不同的attack就的用个自的inherit了,对吗?
可否说是公用一个施舍呢?
如果问了一些太肤浅的,请多多包涵~~
我在看着阿宅(宅男)的link~
在研究着~
作者:
goodday
时间:
2010-6-23 11:59 PM
我也不是很懂的说
他是一个class 的底层
如 zero 说的
ICharacter 就定义了 基本的架构
然后 其他的
warrior, magician, archer
都是已ICharacter 为根本
ICharacter 就定义了
method = > run,attack,walk,defence
property => magic power, healty power, defence level ....etc
warrior, magician, archer 如果 inherit 了 就不用 全部class有不同的咯
如果要多个新的 character 如 Paladins,Hunters 那就 一定要跟 ICharacter 的定义
你一定会问 那如果是 elf , orcs 呢??
覆盖咯 双 interface 咯
如有不对 请指教我哦
作者:
宅男-兜着走
时间:
2010-6-24 12:12 AM
如果这样呢??
class Character
{
....
abstract void Run();
abstract void Attack();
abstract void Defence();
}
class Magician inherit Character implement ISummon
{
overide void Attack(){}
overide void Defence(){}
overide void Run(){}
void Summon()
{
//Summon Different monster than summoner
}
}
class Knight inherit Chatacter
{
overide void Attack(){}
overide void Defence(){}
overide void Run(){}
}
class Archer inherit Character
{
overide void Attack(){}
overide void Defence(){}
overide void Run(){}
}
class Summoner inherit Character implement ISummon
{
overide void Attack(){}
overide void Defence(){}
overide void Run(){}
void Summon()
{
//Summon monster
}
}
interface ISummon
{
void Summon();
}
复制代码
基本动作 让他们去 继承 ,overide, Summon, Black Magic 等, 有个 接口的话??
请指教, 谢谢。
作者:
goodday
时间:
2010-6-24 12:21 AM
宅男-兜着走
你的对了 呵呵
但要自己下手 写了才能 领悟 他的用法
文字很难懂
你override的意思 是 每个的Character 的defence , run , attack 都各有长短
骑士 的 run 最快(最大值)
魔法师的 run 是慢的??
作者:
goodday
时间:
2010-6-24 12:22 AM
class Character
{
....
abstract void Run();
abstract void Attack();
abstract void Defence();
}
是基本动作咯
作者:
宅男-兜着走
时间:
2010-6-24 12:43 AM
本帖最后由 宅男-兜着走 于 2010-6-24 12:45 AM 编辑
回复
8#
goodday
因为我考虑到
魔法师, 因为是 Cast 魔法的, 所以攻击力可能低, Agility 可能会影响到 Run 的成功率, 或速度。 所以我 让每个 Character 有相同的 基本动作, 但是不同的效果。
Interface Summon 方面 我想到, 可能只有 Summoner 有 召唤的法术。 可是因为我考虑到魔法师可能也有。
所以就做成了 Interface 来 让法师们 Implements ==
说是简单啦。 但是实际应用起来的话。==
Class Character 的话 里面是基本动作。 我想到的是如此, 不管是 Orc 还是 Elf, 应该都会 打人, 逃跑, 防卫 ==
补充 : 确实是 工人 不具攻击的角色, 可以设置成 Attack 0 或 1 等低值。
作者:
goodday
时间:
2010-6-24 02:18 AM
你可以做game 咯
几时开发一个??
作者:
宅男-兜着走
时间:
2010-6-24 06:30 AM
回复
11#
goodday
之前做过的 Flash Game 功课算吗?
我没这个本事啦。
反而OO的原理要应用在现实上真的很难。
Final Year , Final Year 越做越火大(抱怨)。
作者:
my_world
时间:
2010-6-24 10:55 AM
回复
7#
宅男-兜着走
好棒的解释!!!
我想问的是,
1 )如果worrior和archer有另一个特别招式"Heal",那我就再增加一个IHeal的interface。可以这样说吗?
2 )如果在这里只有magician有用到summon,其他的都不会用到的话,就不需再用Isummon的interface了,对吗?
我就直接在magician里defined summon的method就行了。可以这样说吗?
作者:
~Zero
时间:
2010-6-24 12:04 PM
差不多对了, 但又有一点不对.
其实只要参考 wikipedia, 那边有另外一种例子, 也不是很难了解的.
其中一个 interface 很大的好处, 就是通过 interface, 可以作出 multiple inheritance 的功能.
一个 coding 技巧, 不一定只有一种用途的.
我看看上面那个 abstract class, 然后 override, 然后用个别的 skill (summon, heal) 来 interface, 有点太滥用 interface 了. 不过如果 code 得出来, 也是可行的. 只是可能会比较难 maintain.
interface 对我来说, 好处就是. 只要我确保全部都有 implement 同一个 interface,
我在当中要用到的时候, 可以不需要管那个是什么 class.
例如, 系统里面, 我不需要
if A is warrior, A.cut.
else if A is archer, A.shoot.
else if A is magician, A.cast
我可以直接 A.Attack.
作者:
my_world
时间:
2010-6-24 03:56 PM
本帖最后由 my_world 于 2010-6-24 04:00 PM 编辑
回复
14#
~Zero
如果说多一个class叫 "Assasin",也是implement - ISummon.
那照这么说
我declare了1个magician - Magic1;
和1个Assasin - Assasin1;
所以Magic1的可以用到Assasin1的summon咯~
可以这么说吗?
作者:
~Zero
时间:
2010-6-24 07:50 PM
interface 本身是没有功能的,
他可以算是一个架构, 或是用来标记 (例如 implements Serialization).
与其在这边说那么多理论, 最好的了解方法还是自己去 code 一番.
欢迎光临 JBTALKS.CC (https://www.jbtalks.cc/)
Powered by Discuz! X2.5