簡體   English   中英

不可能在 .NET 中繼承 2 個基類?

[英]Inheriting 2 base classes in .NET not possible?

所以我讀到在.net 中不可能繼承第二個基類。 那么如何創建一個對象,為 2 個類提供 2 個功能? 例如,我有一個我想成為工具和武器的對象。 第一個是 public class SmithHammer : BaseTool 第二個看起來像 public class SmithHammer : BaseBashing 這兩個類 BaseTool 和 BaseBashing 顯然不能同時用於同一個項目。 作為一種武器,我用這種方式編碼以調用基類 BaseBashing。

{
    [FlipableAttribute( 0x13E3, 0x13E4 )]
    public class SmithyHammer : BaseBashing
    {
        
        public override string Damage { get { return WeaponControl.Settings.SmithyHammerDamage; } }

        public override int OldStrengthReq { get { return 45; } }
        public override int OldMinDamage { get { return 6; } }
        public override int OldMaxDamage { get { return 18; } }
        public override int OldSpeed { get { return 40; } }

        public override int InitMinHits { get { return 31; } }
        public override int InitMaxHits { get { return 60; } }

        [Constructable]
        public SmithyHammer()
            : base(0x13E3)
        {
            Weight = 8.0;
            Layer = Layer.OneHanded;
            Name = "Smith Hammer";
        }

        public SmithyHammer(Serial serial)
            : base(serial)
        { }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write(0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            var version = reader.ReadInt();
        }
    }
}

在第二次使用中,我將其作為工具


namespace Server.Items
{
    [FlipableAttribute( 0x13E3, 0x13E4 )]
    public class SmithHammer : BaseTool
    {
        public override CraftSystem CraftSystem{ get{ return DefBlacksmithy.CraftSystem; } }

        [Constructable]
        public SmithHammer() : base( 0x13E3 )
        {
            Weight = 8.0;
            Layer = Layer.OneHanded;
        }

        [Constructable]
        public SmithHammer( int uses ) : base( uses, 0x13E3 )
        {
            Weight = 8.0;
            Layer = Layer.OneHanded;
        }

        public SmithHammer( Serial serial ) : base( serial )
        {
        }

        public override void Serialize( GenericWriter writer )
        {
            base.Serialize( writer );

            writer.Write( (int) 0 ); // version
        }

        public override void Deserialize( GenericReader reader )
        {
            base.Deserialize( reader );

            int version = reader.ReadInt();
        }
    }
}

是不是不能讓這個項目兼具這兩個功能?

這種情況有一種機制—— 接口 C# 中的類不支持多重繼承,但支持實現多個接口。 在這種情況下,您可以創建兩個(甚至更多)代表所需合同(即接口)的接口:

public interface IBashing
{
    string Damage { get; }
    int OldStrengthReq { get; }
    // ...
    // rest of properties/methods for bashing/weapon
}

public interface ITool
{
    CraftSystem CraftSystem { get; }
    // ...
}

並在Hammer類中實現它們:

public class SmithHammer : IBashing, ITool
{
    public string Damage { get { return WeaponControl.Settings.SmithyHammerDamage; } }
    public int OldStrengthReq { get { return 45; } }
    public CraftSystem CraftSystem { get{ return DefBlacksmithy.CraftSystem; } }
    
    // rest of implemetations
}

客戶端可以通過接口或使用類型測試來使用這個錘子類實例。 例如,如果您引入IItem接口來存儲庫存中的所有內容(即interface IBashing : IIteminterface ITool : IItem ),它可能如下所示:

var inventory = new List<IItem>();
// add some items
// pick some i'th item:
var item = inventory[i];
var tool = item as ITool; // or use pattern matching here
if(tool != null)
{
   // use tool
}
else
{
   ....
}

使用接口共享實現並不是那么容易(除非您可以並且想要使用默認接口實現),但可以通過組合和包裝來實現,即:

public class SmithyHammerBashing : BaseBashing
{
    public override string Damage { get { return WeaponControl.Settings.SmithyHammerDamage; } }
    public override int OldStrengthReq { get { return 45; } }
}
public class SmithHammer : IBashing, ITool
{
    private readonly SmithyHammerBashing Bashing = new SmithyHammerBashing(); // or construct some other way
    public string Damage { get { return Bashing.Damage; } }
    public int OldStrengthReq { get { return Bashing.OldStrengthReq; } }
    // the same approach for ITool
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM