菜鸟教程小白 发表于 2022-12-13 04:45:21

ios - 创建更好的面向对象设计


                                            <p><p>我有以下类(class):</p>

<pre><code>Teacher
Student
Class (like a school class)
</code></pre>

<p>它们都是从具有以下代码的 KObject 扩展而来的:</p>

<pre><code>- initWithKey
- send
- processKey
</code></pre>

<p>Teacher、Student Class 都使用 KObject 父类的函数 processKey 和 initWithKey。他们实现了自己的发送版本。我遇到的问题是永远不应该实例化 KObject 。它更像是一个抽象类,但是objective-c中没有抽象类的概念。它只对允许子类访问一个属性和两个函数有用。</p>

<p>我该怎么做才能使 KObject 无法实例化但仍允许子类访问 KObject 的函数和属性?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>抽象类在 Objective-C 中很常见,<strong> <a href="https://developer.apple.com/library/mac/documentation/general/conceptual/devpedia-cocoacore/ClassCluster.html" rel="noreferrer noopener nofollow">class cluster</a> </strong> - Cocoa 中广泛使用的模式 - 是抽象工厂模式的变体。 </p>

<p>但是,正如您所指出的,没有语言工具可以将方法或类明确划分为抽象 - 这通常在文档中完成。如果您需要额外的安全措施以确保不会以意外方式使用该类,您可以执行以下操作:</p>

<p><strong>初始化器:</strong></p>

<pre><code>//Invocation of the initializer in a sub-class will not raise the exception.
if ( == )
{
   [NSException raise: . . . class is abstract - use subclass.
}
</code></pre>

<p><strong>方法:</strong></p>

<pre><code>- (BOOL)someAbstractMethod
{
    [NSException raise:NSInvalidArgumentException format:@&#34;%@ is abstract&#34;,
      NSStringFromSelector(_cmd)];
    return NO;
}
</code></pre>

<p><strong>协议(protocol)与抽象库</strong></p>

<p>我不同意其他一些答案中提出的“最好使用协议(protocol)”的说法。虽然可以将抽象基类与协议(protocol)结合起来,但不一定更好。 </p>

<p><strong>何时使用协议(protocol)</strong></p>

<p>使用协议(protocol)来指定集成合约——比如插件架构。一个例子是“媒体播放器”,其中为<strong><em>电影</em></strong>和<strong><em>音频</em></strong>实现“播放” > 流将完全不同。 </p>

<p><strong>何时使用抽象基类(或类簇)</strong></p>

<p>当类层次结构之间的某些行为是共享的,并且某些实现细节在特定子类型之间有所不同时,请使用抽象基类。 .在这里使用协议(protocol)不一定更好,除非您希望传达这组方法可交换为另一个实现的意图。 </p>

<p><strong>类集群:</strong></p>

<p>使用类集群,<em>工厂方法</em>获取子类型之一的实例位于基类本身上。有时这会产生可读性和内聚性很好的代码。 <em>(可能与您的具体示例无关,但与 Objective-C 中的抽象类有关)</em></p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 创建更好的面向对象设计,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/19472668/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/19472668/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 创建更好的面向对象设计