0

以下のコードには、インターフェイス、抽象クラス、およびクラスがあります。FreeCustomer クラスの抽象メソッド Print() の実装を無効にしたいと考えています。これは可能ですか?どうもありがとうございました。


    public interface ICustomer
    {
        string CustomerName { get; set; }
        double Amount { get; set; }
        string Print();
    }

    public abstract class Customer : ICustomer
    {
        public string CustomerName { get; set; }
        public double Amount { get; set; }
        public abstract string Print();
    }

    public class GoldCustomer : Customer
    {
        public override string Print() {
            return "You are a Gold Customer: " + CustomerName;
        }
    }

    public class FreeCustomer : Customer 
    {

    }

 
4

3 に答える 3

4

たとえそれが可能であったとしても、それは悪い考えです: なぜ契約の一部だけを実装したいのですか?

ICustomerインターフェースがあまりにも多くの異なることをしようとしているため(したがって、インターフェース分離の原則に違反しているため)、この問題が発生しているようです。

メソッドを常に必要としない、または実装したくない場合Printは、インターフェイスから削除するか、別のインターフェイスに移動します。

于 2012-07-16T05:44:39.280 に答える
1

派生クラスが基本クラスの抽象メソッドを実装する必要がない唯一のケースは、派生クラスも抽象として宣言する場合です。

MSDN doc がここで述べているように、「基本クラスがメンバーを抽象として宣言する場合、そのメソッドは、そのクラスから直接継承する非抽象クラスでオーバーライドする必要があります。派生クラス自体が抽象である場合、それらを実装せずに抽象メンバーを継承します。 ."

したがって、FreeCustomer を抽象的であると宣言し、そこに print を実装する必要はありませんが、何の役にも立たないと思います。

于 2012-07-16T06:12:39.080 に答える
0

abstract特定のケースでは、基本クラスのように関数を宣言しないでください。Customer代わりに、を使用して、基本クラスに空の実装public virtualを提供してください。

次に、実際に機能が必要なクラスでオーバーライドするだけで、Print()他のすべてでは何も実行されません(基本実装が使用されるため)。これは、インターフェース上に保持できることを意味します。

于 2012-07-16T05:56:16.580 に答える